而不是这样做:
res = HttpResponse("Unauthorized")
res.status_code = 401
return res
有没有办法在不每次输入的情况下都这样做?
答案 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
答案 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')