如何在Django中返回401 Unauthorized?

时间:2010-12-05 01:15:28

标签: python django

而不是这样做:

res = HttpResponse("Unauthorized")
res.status_code = 401
return res

有没有办法在不每次输入的情况下都这样做?

6 个答案:

答案 0 :(得分:112)

我知道这是一个旧的,但它是“django 401”的谷歌搜索结果,所以我想我会指出这一点......

假设您已导入django.http.HttpResponse,则可以在一行中执行此操作:

return HttpResponse('Unauthorized', status=401)

'Unauthorized'字符串是可选的。容易。

答案 1 :(得分:9)

class HttpResponseUnauthorized(HttpResponse):
    def __init__(self):
        self.status_code = 401

...
return HttpResponseUnauthorized()

答案 2 :(得分:9)

class HttpResponseUnauthorized(HttpResponse):
    status_code = 401

...
return HttpResponseUnauthorized()

通常,您应该在__init__中设置实例,或者最终得到所有实例之间共享的类变量。但是,Django已经为你做了这个:

class HttpResponse(object):
    """A basic HTTP response, with content and dictionary-accessed headers."""

    status_code = 200

    def __init__(self, content='', mimetype=None, status=None,
            content_type=None):
        # snip...
        if status:
            self.status_code = status

see the Django code in context

答案 3 :(得分:4)

继承解决方案

from django.http import HttpResponse

class Http401(HttpResponse):
    def __init__(self):
        super().__init__('401 Unauthorized', status=401)

util.py中替换多次调用:

return HttpResponse('401 Unauthorized', status=401)

有趣的是,在1.9.6 https://github.com/django/django/blob/1.9.6/django/http/response.py#L443中还有其他命名的回复,但不是401。

答案 4 :(得分:2)

编写一个视图装饰器,检查相应的HTTP标头并返回相应的响应(响应代码401没有built-in type。)

答案 5 :(得分:1)

from django.core.exceptions import PermissionDenied

# Some class or def...
    if (condition):
        raise PermissionDenied

这就是我将其添加到您的主模板文件夹中的403.html的方式。好处是,即使在不期望响应对象的继承函数中,也可以将其放置在任何位置。下面是我如何使用它的一个更真实的示例,该示例显示用户数据和一些所有权详细信息。

from django.views.generic import ListView
from app.models import ExampleModel

class UserProfileDetail(ListView):
model = ExampleModel
template_name = 'auth/user_detail.html'
paginate_by = 10

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    if 'pk' in self.kwargs:
        context['username'] = User.objects.get(id=self.kwargs['pk'])
        if not self.request.user.is_staff \
                and context['username'] != self.request.user:
            raise PermissionDenied
    else:
        context['username'] = self.request.user
    return context

def get_queryset(self):
    queryset = super().get_queryset()
    if 'pk' in self.kwargs:
        return queryset.filter(user=self.kwargs['pk'])
    else:
        return queryset.filter(user=self.request.user).order_by('id')