Как вернуть 401 Несанкционированный в Джанго? - PullRequest
40 голосов
/ 05 декабря 2010

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

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

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

Ответы [ 6 ]

114 голосов
/ 18 мая 2012

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

Если вы уже импортировали django.http.HttpResponseВы можете сделать это в одной строке:

return HttpResponse('Unauthorized', status=401)

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

9 голосов
/ 10 января 2013
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 в контексте )

9 голосов
/ 05 декабря 2010
class HttpResponseUnauthorized(HttpResponse):
    def __init__(self):
        self.status_code = 401

...
return HttpResponseUnauthorized()
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.

2 голосов
/ 05 декабря 2010

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

1 голос
/ 27 июня 2018
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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...