【发布时间】:2011-05-20 09:38:22
【问题描述】:
不要这样做:
res = HttpResponse("Unauthorized")
res.status_code = 401
return res
有没有办法不用每次都输入?
【问题讨论】:
不要这样做:
res = HttpResponse("Unauthorized")
res.status_code = 401
return res
有没有办法不用每次都输入?
【问题讨论】:
继承解决方案
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)
只需:
return Http401()
有趣的是,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)
super().__init__: stackoverflow.com/a/33191175/895245 。可以添加message,但如果您不使用 API,仅使用 HTTP 浏览器端点,则不是很有必要。
__init__ 的末尾:self['WWW-Authenticate'] = 'FormBased'。
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
【讨论】:
我知道这是一个旧的,但它是“django 401”的最佳 Google 结果,所以我想我会指出这一点......
假设您已经导入了django.http.HttpResponse,您可以在一行中完成:
return HttpResponse('Unauthorized', status=401)
'Unauthorized' 字符串是可选的。很简单。
【讨论】:
urls.py 中定义 handler403,然后在 raise django.core.exceptions.PermissionDenied 中定义。
return HttpResponseForbidden 也适用于 403(提出一个例外,因为你建议它通常更方便)。 401 和 403 并不完全相同,尽管有些人争论确切的区别。
WWW-Authenticate 标头,任何系统都无法识别当今大多数身份验证系统,因此除非您使用基本身份验证,否则我认为这是一个违反规范的务实案例。 IMO 403 有一个单独的目的(即您已通过身份验证,但您无权访问此 [403] 与您尚未通过身份验证 [401])
class HttpResponseUnauthorized(HttpResponse):
def __init__(self):
self.status_code = 401
...
return HttpResponseUnauthorized()
【讨论】:
__init__方法中,在类定义中设置属性即可。
__init__中放置一些。
'HttpResponseUnauthorized' object has no attribute '_headers'
编写一个视图装饰器,检查相应的 HTTP 标头并返回相应的响应(响应代码 401 没有 built-in type)。
【讨论】: