Django的1.11上passenger_wsgi没有路由POST请求(Django 1.11 o

2019-09-29 08:58发布

我试图建立蟒蛇在A2共享通过passenger_wsgi托管。 当我通过“的runserver”运行的应用程序工作正常。 我无论是在本地PC,并通过SSH隧道测试这一点。

然而,当我尝试设置此上passenger_wsgi,它似乎无法能够路由POST请求。

  1 import os
  2 import sys
  3 
  4 sys.path.insert(0, "/home/<username>/app")
  5 
  6 import APP_CORE
  7 
  8 # where is the python interpreter
  9 INTERP = "/home/<username>/app/.virtualenv/bin/python"
 10 if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)
 11 
 12 
 13 os.environ['DJANGO_SETTINGS_MODULE'] = "APP_CORE.settings"
 14 
 15 import APP_CORE.wsgi
 16 application = APP_CORE.wsgi.application

例如:当我打开管理页面(/管理/登录),它可以加载登录页面,但在提交凭据时,它说,POST到/管理/登入没有找到 - 返回HTTP 404。

当我通过的runserver运行相同的流量工程 - 我觉得我可能会错过在Django的WSGI配置的东西。 任何帮助,将不胜感激 !!

编辑/更新:潜水进入resolver.py和base.py:_get_response后,我注意到,不知何故/路/信息截断URL的第一位。 例如,当我请求/管理/登入/,路径信息只显示/登录 - 但是当我使用的runserver,它被正确地传递直通如/管理/登录。 对我来说,这显然是对Web服务器的设置,而不是Django的网站的问题。 因此,会尝试与A2Hosting去解决它?

Answer 1:

它看起来像你可能已经解决了这个,但随动的人,可能在这里绊倒。 我一直在使用A2Hosting,乘客和的cPanel使用Django(和鹡鸰)。 我发现,期间POST请求WSGI SCRIPT_NAME被设定为相对路径,而不是应用程序的根。

当我将记录到每个应用程序调用,正确的GET请求是:

{
  'REQUEST_URI': '/admin/',
  'PATH_INFO': '/admin/',
  'SCRIPT_NAME': '',
  'QUERY_STRING': '',
  'REQUEST_METHOD': 'GET',
  ...

但是,在该网页上,一个形式提交一个POST ,其中有PATH_INFO错误地设置:

{
  'REQUEST_URI': '/admin/login/',
  'PATH_INFO': '/login/',
  'SCRIPT_NAME': '/admin',
  'QUERY_STRING': '',
  'REQUEST_METHOD': 'POST',
  ...

我结束了使用的解决方法是建立中间件其声称已知SCRIPT_NAME和重建PATH_INFO从它。

# Set this to your root
SCRIPT_NAME = ''

class PassengerPathInfoFix(object):
    """
    Sets PATH_INFO from REQUEST_URI since Passenger doesn't provide it.
    """
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        from urllib.parse import unquote
        environ['SCRIPT_NAME'] = SCRIPT_NAME

        request_uri = unquote(environ['REQUEST_URI'])
        script_name = unquote(environ.get('SCRIPT_NAME', ''))
        offset = request_uri.startswith(script_name) and len(environ['SCRIPT_NAME']) or 0
        environ['PATH_INFO'] = request_uri[offset:].split('?', 1)[0]
        return self.app(environ, start_response)


application = get_wsgi_application()
application = PassengerPathInfoFix(application)

相关阅读:

  • http://alyalearningdjango.blogspot.com/2014/05/issue-360-passenger-doesnt-set-pathinfo.html
  • https://github.com/phusion/passenger/issues/460
  • https://www.python.org/dev/peps/pep-0333/#environ-variables


文章来源: Django 1.11 on passenger_wsgi not routing POST request