由于某些原因,Django将Python Requests库帖子解释为GET

时间:2019-07-11 19:48:45

标签: python django django-rest-framework python-requests

我正在尝试向我们的应用程序的api发出发布请求以进行一些回归测试,但是由于某种原因,当我通过请求发出请求时,它被记录并解释为GET请求。

代码:

requests.post({HTTP_PROTOCOL}://{APP_URL}/api/route/',
              headers={'Authorization': 'Bearer ' + access_token},
              json=DATA)

日志:

[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)

但是,当我通过Postman发出请求时,该请求可以正常工作,并以JSON形式返回创建的对象,并在日志中将其记录为POST。

后端目前是使用Django Rest Framework for REST API使用Django编写的。这是我们的urls.py文件中的路线:

url(r"^api/route/$", DataListView.as_view())

我知道DataListView可以工作,因为Postman可以很好地工作。

我也遇到了类似的问题,因为它是在没有斜线的情况下发布到路线的,因此无法使用,这里不是这种情况。我知道我会以斜线结尾发布到路线,如您所见。

问题:如何使它工作?为什么它可以在Postman中工作,但不使用requests库呢?

编辑1: 如果有任何线索,这是请求中的标头:

{
    'User-Agent': 'python-requests/2.22.0',
    'Accept-Encoding': 'gzip, deflate',
    'Accept': '*/*',
    'Connection': 'keep-alive',
    'Authorization': 'Bearer <access-token>'
}

编辑2: 我就是这样做的:

print(resp.request.method)

并打印出GET ...不知道为什么。不过,当我在本地服务器上运行时,它会打印出POST。它是否与我发布到https:// URL的事实有关?这很奇怪。

this看来,这可能是由于301或302重定向导致的。

1 个答案:

答案 0 :(得分:1)

我最终按照@IanStapletonCordasco的建议进行了调试,以解决所链接的问题,并发现我的HTTP_PROTOCOL被设置为"http"而不是"https",这将导致从 nginx 进行的代理重定向,该重定向将POST更改为GET。我在设置该变量的配置文件中对其进行了更改,并且可以正常工作。

还有其他需要注意的地方,对于遇到类似问题的人,请查看发布到的URL。如果您在Django中启用了严格的尾部斜杠检查(我敢肯定默认情况下处于启用状态),并且要发布到没有尾部斜杠的URL,它将返回30倍的重定向响应,这将导致发生类似的事情。尝试添加斜杠,它应该可以工作。