向开发服务器发送请求时,我可以包含一个标头,如下所示:
{
"payload": {
"google": {
"expectUserResponse": true,
"richResponse": {
"items": [
{
"simpleResponse": {
"textToSpeech": "328 characters here"
}
},
{
"basicCard": {
"title": "39 characters",
"subtitle": "16 characters",
"formattedText": "82 characters here"
}
}
],
"suggestions": [
{
"title": "13 characters"
},
{
"title": "14 characters"
},
{
"title": "6 characters"
}
]
}
}
},
"outputContexts": [
{
"name": "default",
"lifespanCount": 99,
"parameters": {
"data": "54 characters"
}
}
]
}
在Django内部,您看到一个Authorization: Token efc7fa291f4e320ff4a31cf9a11d6de3a366937cd1ec24e0a7ab68dafa38430f\r\n
头,我不确定该头在哪里生成。
但是在使用Django测试客户端进行单元测试时:
HTTP_AUTHORIZATION
Django无法授权该请求。
如果相反,我将执行以下操作:
from django.test import Client
c = Client()
response = c.get('/api/auth/user/', **{'Authorization': 'Token ' + token})
有效。
我想了解发生了什么事。
谁负责执行映射response = c.get('/api/auth/user/', **{'HTTP_AUTHORIZATION': 'Token ' + token})
-> Authorization
?
与此问题有关:我正在使用HTTP_AUTHORIZATION
,Django 2.1.5
和djangorestframework = "==3.9.0"
答案 0 :(得分:0)
这是Django documentation所说的:
通过
**extra
发送的标头应遵循CGI规范。例如,模拟在HTTP请求中从浏览器发送到服务器的另一个“主机”标头应作为HTTP_HOST传递。
这是相关的CGI报价:
HTTP _ *:
这些变量特定于使用HTTP发出的请求。 这些变量的解释可能取决于 SERVER_PROTOCOL。
名称以“ HTTP_”开头的环境变量包含 如果使用的协议是HTTP,则从客户端读取标头数据。 HTTP标头名称转换为大写,具有所有 出现的“-”替换为“ ”,并以“ HTTP ”开头 给出环境变量名称。标头数据可能是 由客户发送,也可以通过以下方式重写 请勿更改其语义。如果多个标头具有相同的 收到字段名称,则必须将它们重写为单个 具有相同语义的标头。同样,标头为 多行收到的信息必须合并为一行。 服务器必须在必要时更改服务器的表示。 适用于CGI的数据(例如字符集) 环境变量。
这是Django所见,因为您的所有请求均由与CGI兼容的应用服务器(实际上是WSGI,例如gunicorn和uwsgi)处理。因此,基本上,测试客户端需要CGI请求,这意味着您必须根据上述规则转换HTTP标头。