Вместо этого:
res = HttpResponse("Unauthorized")
res.status_code = 401
return res
Есть ли способ сделать это, не набирая его каждый раз?
Вместо этого:
res = HttpResponse("Unauthorized")
res.status_code = 401
return res
Есть ли способ сделать это, не набирая его каждый раз?
Я знаю, что это старый, но это лучший результат Google для "django 401", поэтому я подумал, что хочу указать на это...
Предполагая, что вы уже импортировали django.http.HttpResponse
, вы можете сделать это в одной строке:
return HttpResponse('Unauthorized', status=401)
Строка 'Unauthorized'
является необязательной. Легко.
class HttpResponseUnauthorized(HttpResponse):
def __init__(self):
self.status_code = 401
...
return HttpResponseUnauthorized()
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
Напишите декоратор, который проверяет соответствующие заголовки HTTP и возвращает соответствующий ответ (нет встроенный тип для кода ответа 401).
Решение о наследовании
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.