Gunicorn POST 请求上的 Django 服务被接收为 GET?

Kas*_*rTr 2 python django node.js gunicorn axios

我有一个 Django Rest 服务在 Gunicorn 服务器上的虚拟环境中运行,具有以下 .wsgi 文件:

import os, sys import site

site.addsitedir('/opt/valuation/env/lib/python2.7/site-packages')


sys.stdout = sys.stderr
os.environ['DJANGO_SETTINGS_MODULE'] = 'valuation.valuationcont.valuation.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Run Code Online (Sandbox Code Playgroud)

当我执行curl POST 调用时,该服务工作正常:

curl -H "Content-Type: application/json" -X POST -d '{...}' -u username:password http://localhost:8000/valuation/predict/
Run Code Online (Sandbox Code Playgroud)

但是,当我使用 axios 在 API 网关上执行相同的请求时,Django 服务会响应我的自定义 GET 响应(“GET 不支持,请尝试 POST”)。

axios({
    method: 'post',
    url:'http://localhost:8000/valuation/predict',
    headers:{
      "Content-Type":"application/json",
      "Authorization":"Basic [BASE64 ENCODING]"
    },
    data:{
      ...
    }
}).then(response=>{
  console.log(response.data)
}).catch(err=>{
  console.log(err.toString())
})
Run Code Online (Sandbox Code Playgroud)

请求从 GET 转换为 POST。这只发生在 django/gunicorn 服务中。

由于我是 django/gunicorn 的新手,我认为 .wsgi 文件有问题。但是curl 调用是如何起作用的呢?

感谢任何帮助,我已经为此苦苦挣扎了一个星期了。

编辑

设法在我的本地计算机上重现相同的问题。使用其 API 的 axios POST 请求被转换为 GET。

使用该axios.post(...)方法我设法得到 403 和 201。尽管 POSTMAN 工作正常。

我怀疑,由于 POST 失败,axios API 有一个默认的回退到 GET,然后它不会失败并且服务正常响应(“GET 不支持”,正如应该的那样)。

调试此问题的新步骤是问,如何在 JavaScript 中尽可能接近地重新创建 POSTMAN POST 调用,因为 POSTMAN 正在工作,并且显然是 axios 导致了问题。

Dan*_*man 5

您没有使用相同的 URL。在curl片段中,您请求http://localhost:8000/valuation/predict/,但在第二个片段中,您请求http://localhost:8000/valuation/predict - 没有最后的斜杠。

默认情况下,Django 会将不以斜杠结尾的 URL 重定向到以斜杠结尾的 URL,并且重定向始终是 GET。