我试图建立蟒蛇在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去解决它?
它看起来像你可能已经解决了这个,但随动的人,可能在这里绊倒。 我一直在使用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