如何在Django中返回401 Unauthorized?

TIM*_*MEX 45 python django

而不是这样做:

res = HttpResponse("Unauthorized")
res.status_code = 401
return res
Run Code Online (Sandbox Code Playgroud)

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

Stu*_*Cox 124

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

假设您已经导入django.http.HttpResponse,可以在一行中完成:

return HttpResponse('Unauthorized', status=401)
Run Code Online (Sandbox Code Playgroud)

'Unauthorized'字符串是可选的.简单.

  • @SimonSteinberger非常正确,但是没有标准的`WWW-Authenticate`标题,任何系统都可以识别当今的大多数auth系统,所以除非你使用Basic Auth我认为这是一个违反规范的实用案例.IMO 403有一个单独的目的(即你已经过身份验证但是你不能访问这个[403]而你尚未进行身份验证[401]) (8认同)
  • 这是可以接受的,我赞成它; 但是 - 对于类似的情况,我会考虑使用错误403(Forbidden) - 因为有一个现成的机制:https://docs.djangoproject.com/en/dev/topics/http/views/#the-403- http-forbidden-view - 在root`urls.py`中定义`handler403`,然后`raise django.core.exceptions.PermissionDenied`. (4认同)
  • @TomaszGandor 是的,或者 `return HttpResponseForbidden` 也适用于 403(引发异常,因为您建议它通常更方便)。401 和 403 并不完全相同,尽管有些人对确切的区别存在争议。 (2认同)

Gle*_*ard 9

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

...
return HttpResponseUnauthorized()
Run Code Online (Sandbox Code Playgroud)

  • 从查看django.http.__init__.py中添加它在类定义中似乎是首选方法,如果你希望在__init__中调用它,应该通过super调用HttpRepsonses构造函数 (3认同)
  • 您不需要将它放在`__init__`方法中,只需在类定义中设置该属性即可. (2认同)

Wil*_*hes 9

class HttpResponseUnauthorized(HttpResponse):
    status_code = 401

...
return HttpResponseUnauthorized()
Run Code Online (Sandbox Code Playgroud)

通常,您应该设置实例,__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
Run Code Online (Sandbox Code Playgroud)

(参见上下文中的Django代码)


Cir*_*四事件 9

继承解决方案

from django.http import HttpResponse

class Http401(HttpResponse):
    def __init__(self):
        super().__init__('401 Unauthorized', status=401)
Run Code Online (Sandbox Code Playgroud)

在 autil.py中替换多次调用:

return HttpResponse('401 Unauthorized', status=401)
Run Code Online (Sandbox Code Playgroud)

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

  • 我喜欢这个回应。但是 `__init__(self):` 应该像这样改变 `super(Http401, self).__init__(message, status=401)` (2认同)

Ign*_*ams 3

编写一个视图装饰器来检查适当的 HTTP 标头并返回适当的响应(响应代码 401没有内置类型)。