首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >passenger_wsgi上的Django 1.11没有路由POST请求

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

Stack Overflow用户
提问于 2018-04-01 12:59:09
回答 1查看 918关注 0票数 1

我正在尝试通过passenger_wsgi在A2共享主机上设置python。当我通过“runserver”运行应用程序时,它运行得很好。我在本地PC上和通过SSH隧道对此进行了测试。

但是,当我尝试在passenger_wsgi上设置它时,它似乎无法路由POST请求。

代码语言:javascript
复制
  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 )时,它可以加载登录页面,但在提交凭据时,它显示没有找到到/admin/ login的POST -返回HTTP404。

当我通过runserver运行时,同样的流程-我觉得我可能在django WSGI配置中遗漏了一些东西。任何帮助都将不胜感激!!

编辑/更新:在深入研究resolver.py和base.py:_get_response之后,我注意到/path/info以某种方式截断了URL的第一部分。例如,当我请求/admin /login /时,路径信息只显示/login-但是当我使用runserver时,它被正确地作为/admin/login传递。对我来说,这显然是web服务器设置的问题,而不是django站点的问题。所以我会试着用A2Hosting解决这个问题...

EN

回答 1

Stack Overflow用户

发布于 2018-06-13 07:34:19

看起来你可能已经解决了这个问题,但是对于任何可能在这里遇到困难的人来说,请继续跟进。我一直将A2Hosting、Passenger和CPanel与django (和wagtail)一起使用。我发现在POST请求期间,wsgi SCRIPT_NAME被设置为相对路径,而不是应用程序的根。

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

代码语言:javascript
复制
{
  'REQUEST_URI': '/admin/',
  'PATH_INFO': '/admin/',
  'SCRIPT_NAME': '',
  'QUERY_STRING': '',
  'REQUEST_METHOD': 'GET',
  ...

但是在该页面上,一个表单正在提交一个POST,它的PATH_INFO设置不正确:

代码语言:javascript
复制
{
  'REQUEST_URI': '/admin/login/',
  'PATH_INFO': '/login/',
  'SCRIPT_NAME': '/admin',
  'QUERY_STRING': '',
  'REQUEST_METHOD': 'POST',
  ...

我最终使用的变通方法是创建中间件,它断言一个已知的SCRIPT_NAME并从它重新构建PATH_INFO

代码语言:javascript
复制
# 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)

相关阅读:

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49594955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档