Подтвердить что ты не робот

Как вернуть 401 Unauthorized в Django?

Вместо этого:

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

Есть ли способ сделать это, не набирая его каждый раз?

4b9b3361

Ответ 1

Я знаю, что это старый, но это лучший результат Google для "django 401", поэтому я подумал, что хочу указать на это...

Предполагая, что вы уже импортировали django.http.HttpResponse, вы можете сделать это в одной строке:

return HttpResponse('Unauthorized', status=401)

Строка 'Unauthorized' является необязательной. Легко.

Ответ 2

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

...
return HttpResponseUnauthorized()

Ответ 3

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 в контексте)

Ответ 4

Напишите декоратор, который проверяет соответствующие заголовки HTTP и возвращает соответствующий ответ (нет встроенный тип для кода ответа 401).

Ответ 5

Решение о наследовании

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.