我正在尝试通过passenger_wsgi在A2共享主机上设置python。 当我通过'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
示例:当我加载管理页面(/ admin / login)时,它可以加载登录页面,但是在提交凭据时,它表示找不到POST到/ admin / login - 返回HTTP 404.
当我通过runserver运行时的SAME流程 - 我觉得我可能在django WSGI配置中遗漏了一些东西。任何帮助将不胜感激!!
编辑/更新:在深入了解resolver.py和base.py:_get_response之后,我注意到/ path / info以某种方式截断了URL的第一位。例如,当我请求/ admin / login /时,路径信息仅显示/ login - 但是当我使用runserver时,它正确地传递为/ admin / login。对我而言,这显然是Web服务器设置上的问题,而不是django站点上的问题。所以将试着用A2Hosting来解决它......
答案 0 :(得分:5)
看起来你可能已经解决了这个问题,但对任何可能在这里绊倒的人采取后续行动。我一直在使用A2Hosting,Passenger和CPanel与django(和wagtail)。我发现在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)
相关阅读: