如何使django login_required装饰器引发HTTP401异常

时间:2018-02-06 04:02:38

标签: python django

我使用Django login_required装饰器,但我希望login_required引发HTTP401未经授权的异常,而不是重定向到登录URL。

2 个答案:

答案 0 :(得分:0)

如果您希望专门login_required执行此操作,则可能必须覆盖它。否则,你可以做到这一点:

def view_func(request):
    if request.user.is_anonymous:
        return HttpResponse('Unauthorized', status=401)
    # write all the code for your view that was there before

答案 1 :(得分:0)

我创建了一个自定义装饰器,以在用户未通过身份验证时返回401响应。

from functools import wraps
from django.http import HttpResponse

def user_passes_test(test_func):
    def decorator(view_func):
        @wraps(view_func)
        def _wrapped_view(request, *args, **kwargs):
            if test_func(request.user):
                return view_func(request, *args, **kwargs)
            return HttpResponse('Unauthorized', status=401)
        return _wrapped_view
    return decorator

def login_required_401(function=None):
    actual_decorator = user_passes_test(
        lambda u: u.is_authenticated,
    )
    if function:
        return actual_decorator(function)
    return actual_decorator

示例

@login_required_401
def example_view(request):
    # write your code here