代码之家  ›  专栏  ›  技术社区  ›  KasparTr

gunicorn POST请求上的Django服务作为GET收到?

  •  2
  • KasparTr  · 技术社区  · 6 年前

    我有一个Django rest服务,它运行在gunicorn服务器上的Virtual环境上,如下所示。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 call时,服务效果非常好:

    curl -H "Content-Type: application/json" -X POST -d '{...}' -u username:password http://localhost:8000/valuation/predict/
    

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

    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调用是如何工作的呢?

    感谢您的帮助,我已经为此挣扎了一周了。

    编辑 :

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

    使用 axios.post(...) 方法我设法得到403和201。一直以来,邮递员工作得很好。

    我怀疑,由于POST失败,axios API有一个默认的回退来获取,然后该回退不会失败,服务会正常响应(“按原样获取不支持”)。

    调试这一问题的新步骤是,如何在javascript中尽可能接近地重新创建POSTMAN POST调用,因为POSTMAN正在工作,而且很明显是axios造成了问题。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Daniel Roseman    6 年前

    您使用的URL不同。在您请求的curl片段中 http://localhost:8000/valuation/predict/ 但在你要求的那一秒 http://localhost:8000/valuation/predict -没有最后的斜杠。

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