gunicorn POST 上的 Django 服务请求以 GET 形式接收?
Django service on gunicorn POST request is recieved as GET?
我在 gunicorn 服务器的虚拟环境中有一个 Django 休息服务 运行,具有以下 .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()
当我执行 curl POST 调用时,该服务完美运行:
curl -H "Content-Type: application/json" -X POST -d '{...}' -u username:password http://localhost:8000/valuation/predict/
但是当我使用 axios 在 API 网关上执行相同的请求时,Django 服务会响应我的自定义 GET 响应 ("GET not supported, try 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())
})
请求从 GET 转换为 POST。
这只发生在 django/gunicorn 服务中。
由于我是 django/gunicorn 的新手,我认为 .wsgi 文件有问题。但是 curl 调用怎么会起作用呢?
感谢任何帮助,现在已经为此苦苦挣扎了一个星期。
编辑:
设法在我的本地机器上重现了同样的问题。 axios POST 使用其 API 的请求被翻译成 GET。
使用 axios.post(...)
方法我设法获得了 403 和 201。而 POSTMAN 工作正常。
我怀疑由于 POST 失败 axios API 有一个默认回退到 GET 然后不会失败并且服务正常响应("GET not supported" 应该) .
调试这个的新步骤是问,我如何重新创建 POSTMAN POST 尽可能接近 javascript 的调用,因为 POSTMAN 正在工作显然是 axios 导致了问题。
您使用的不是同一个 URL。在 curl 片段中,您请求 http://localhost:8000/valuation/predict/ but in the second you request http://localhost:8000/valuation/predict - 没有最后的斜杠。
默认情况下,Django 将 URL 不以斜杠结尾的重定向到以斜杠结尾的重定向,并且重定向始终是 GET。
我在 gunicorn 服务器的虚拟环境中有一个 Django 休息服务 运行,具有以下 .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()
当我执行 curl POST 调用时,该服务完美运行:
curl -H "Content-Type: application/json" -X POST -d '{...}' -u username:password http://localhost:8000/valuation/predict/
但是当我使用 axios 在 API 网关上执行相同的请求时,Django 服务会响应我的自定义 GET 响应 ("GET not supported, try 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())
})
请求从 GET 转换为 POST。 这只发生在 django/gunicorn 服务中。
由于我是 django/gunicorn 的新手,我认为 .wsgi 文件有问题。但是 curl 调用怎么会起作用呢?
感谢任何帮助,现在已经为此苦苦挣扎了一个星期。
编辑:
设法在我的本地机器上重现了同样的问题。 axios POST 使用其 API 的请求被翻译成 GET。
使用 axios.post(...)
方法我设法获得了 403 和 201。而 POSTMAN 工作正常。
我怀疑由于 POST 失败 axios API 有一个默认回退到 GET 然后不会失败并且服务正常响应("GET not supported" 应该) .
调试这个的新步骤是问,我如何重新创建 POSTMAN POST 尽可能接近 javascript 的调用,因为 POSTMAN 正在工作显然是 axios 导致了问题。
您使用的不是同一个 URL。在 curl 片段中,您请求 http://localhost:8000/valuation/predict/ but in the second you request http://localhost:8000/valuation/predict - 没有最后的斜杠。
默认情况下,Django 将 URL 不以斜杠结尾的重定向到以斜杠结尾的重定向,并且重定向始终是 GET。