Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何返回Django中未经授权的401?_Python_Django - Fatal编程技术网

Python 如何返回Django中未经授权的401?

Python 如何返回Django中未经授权的401?,python,django,Python,Django,而不是这样做: res = HttpResponse("Unauthorized") res.status_code = 401 return res 有没有办法不用每次都输入它呢?编写一个视图装饰程序,检查适当的HTTP头并返回适当的响应(没有响应代码401)。我知道这是一个老版本,但它是“django 401”在谷歌搜索结果中排名靠前的版本,所以我想指出这一点 假设您已经导入了django.http.HttpResponse,您可以在一行中完成: return HttpResponse('

而不是这样做:

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

有没有办法不用每次都输入它呢?

编写一个视图装饰程序,检查适当的HTTP头并返回适当的响应(没有响应代码401)。

我知道这是一个老版本,但它是“django 401”在谷歌搜索结果中排名靠前的版本,所以我想指出这一点

假设您已经导入了
django.http.HttpResponse
,您可以在一行中完成:

return HttpResponse('Unauthorized', status=401)
'Unauthorized'
字符串是可选的。简单

class HttpResponseUnauthorized(HttpResponse):
    status_code = 401

...
return HttpResponseUnauthorized()
通常,您应该在
\uuuu init\uuuu
中设置实例,否则最终会得到在所有实例之间共享的类变量。但是,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

()

继承解决方案

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中还有其他命名响应,但不是401。

您不需要将其放入
\uuuu init\uuuu
方法中,只需在类定义中设置该属性。@Matthew:我通常不会这样做。它很容易落入无意中共享对象的陷阱,在类主体中放置一些初始化和在类定义中放置一些初始化是不清楚的。这会返回以下错误:
'HttpResponseUnauthorized'对象没有属性'\u headers'
,通过查看django.http.\uu init\uuupy.py将其添加到类定义中似乎是最好的方法,如果您希望在initthrows中调用httpresses构造函数,那么应该通过super调用它。对象没有属性'\u headers',这是可以通过的,我对它进行了升级;然而,对于类似的情况,我会考虑使用错误403(禁止)-因为有一个现成的机制:-只需在root <代码> URL.Py < /代码>中定义<代码> HANDLR403,然后增加Django.Cype。ExpReStudio被拒绝< /代码> .@ ToMasZgand and YEP,或<代码>返回HythPrimePosivs(如您所建议的,引发异常通常更方便).401和403并不完全相同,尽管有些人对两者的确切区别存在争议。根据维基百科,401响应必须包含一个WWW-Authenticate标头字段。因此,使用403更简单。@SimonSteinberger非常正确,但没有任何系统都能识别的标准
WWW-Authenticate
标头因此,除非您使用的是Basic Auth,否则我认为这是违反规范的实际情况。IMO 403有一个单独的目的(即,您已通过身份验证,但不允许访问此[403]与您尚未通过身份验证的[401])我想不出没有API的401用例,所以如果有人有想法的话..像drf这样的API框架通常包括一个401:我喜欢这个响应。但是
\uuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuo(self):
的行应该像
super(Http401,self)这样改变.\uuuu init\uuuuuu
:.A
消息可以添加,但是如果你不做API,只做HTTP浏览器端点,这不是非常必要。好的。解决方案在1.8.6 Django和2.7 Python中抛出了一个错误。我的建议帮助解决了这个问题。也许它可以与Python 3一起工作。不过,在这些答案中,我最喜欢这个解决方案。你呢如果您希望满足在使用401响应时包含该标头的要求,可以添加到
\uuuu init\uuuu
self['WWW-Authenticate']='formbase'
的末尾。
return HttpResponse('401 Unauthorized', status=401)