如何在Django中返回401未授权?

73 投票
5 回答
63206 浏览
提问于 2025-04-16 08:03

与其每次都这样做:

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

有没有什么方法可以不用每次都输入这些呢?

5 个回答

12

继承解决方案

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这个。

12
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 代码的具体内容)

170

我知道这个问题比较老,但它在谷歌上搜索“django 401”时排第一,所以我想提一下...

假设你已经导入了 django.http.HttpResponse,你可以用一行代码来实现:

return HttpResponse('Unauthorized', status=401)

这里的 'Unauthorized' 字符串是可选的。很简单。

撰写回答