由于某种原因,Python 请求库帖子被 Django 解释为 GET

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 重定向导致了此问题。

Eth*_*wer 5

我最终按照 @IanStapletonCordasco 在我链接到的问题中建议的调试方式进行操作,并发现我的设置HTTP_PROTOCOL被设置为"http"而不是"https",这将导致从nginx 的代理重定向,将 更改POSTGET. 我在设置该变量的配置文件中更改了它,并且它起作用了。

还有一点需要注意,对于遇到类似问题的人,请查看您发布到的 URL。如果您在 Django 中打开了严格的尾随斜杠检查(我很确定默认情况下是打开的),并且您发布到没有尾随斜杠的 URL,它将返回一个 30x 重定向响应,这将导致类似的事情也会发生。尝试添加斜杠,它应该可以工作。