Eth*_*wer 2 python django python-requests django-rest-framework
我试图向我们应用程序的 api 发出一个 post 请求以进行一些回归测试,但由于某种原因,当我通过 requests 发出这样的请求时,它会被记录并解释为 GET 请求。
代码:
requests.post({HTTP_PROTOCOL}://{APP_URL}/api/route/',
headers={'Authorization': 'Bearer ' + access_token},
json=DATA)
Run Code Online (Sandbox Code Playgroud)
日志:
[Thu Jul 11 19:17:30 2019] GET /api/route/ => generated 2 bytes in 64 msecs (HTTP/1.1 200) 5 headers in 162 bytes (1 switches on core 1)
Run Code Online (Sandbox Code Playgroud)
然而,当我通过 Postman 发出请求时,请求工作得很好,并以 JSON 格式返回创建的对象,并且在日志中将其记录为 POST。
后端目前是用 Django 编写的,使用 Django Rest Framework 来实现 REST API。这是我们文件中的路线urls.py:
url(r"^api/route/$", DataListView.as_view())
Run Code Online (Sandbox Code Playgroud)
我知道这是DataListView可行的,因为邮递员可以很好地使用它。
我也遇到过类似的问题,它不起作用,因为我发布到的路线没有斜杠,但这里不是这种情况。我知道我正在发布带有尾部斜杠的路线,正如您自己看到的那样。
问:我该如何让它发挥作用?为什么它可以在 Postman 中工作,但不能使用requests库?
编辑 1:如果提供任何线索,这是请求中的标头:
{
'User-Agent': 'python-requests/2.22.0',
'Accept-Encoding': 'gzip, deflate',
'Accept': '*/*',
'Connection': 'keep-alive',
'Authorization': 'Bearer <access-token>'
}
Run Code Online (Sandbox Code Playgroud)
编辑2:我刚刚这样做了:
print(resp.request.method)
Run Code Online (Sandbox Code Playgroud)
它打印出来了GET......不知道为什么。当我这样做时,我的本地服务器打印出了POST. 这是否与我发布到 URL 的事实有关https://?这很奇怪。
由此看来,可能是 301 或 302 重定向导致了此问题。
我最终按照 @IanStapletonCordasco 在我链接到的问题中建议的调试方式进行操作,并发现我的设置HTTP_PROTOCOL被设置为"http"而不是"https",这将导致从nginx 的代理重定向,将 更改POST为GET. 我在设置该变量的配置文件中更改了它,并且它起作用了。
还有一点需要注意,对于遇到类似问题的人,请查看您发布到的 URL。如果您在 Django 中打开了严格的尾随斜杠检查(我很确定默认情况下是打开的),并且您发布到没有尾随斜杠的 URL,它将返回一个 30x 重定向响应,这将导致类似的事情也会发生。尝试添加斜杠,它应该可以工作。
| 归档时间: |
|
| 查看次数: |
402 次 |
| 最近记录: |