Django 1.11 наpassenger_wsgi не маршрутизирует POST-запрос

Я пытаюсь настроить python на виртуальном хостинге A2 через пассажир_wsgi. Приложение работает нормально, когда я запускаю его через «runserver». Я тестировал это как на своем локальном ПК, так и через туннель SSH.

Однако, когда я пытаюсь настроить это для пассажира_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, работает - я чувствую, что могу что-то упустить в конфигурации django WSGI. Любая помощь будет оценена!

Изменить/обновить: после погружения в resolver.py и base.py:_get_response я заметил, что /path/info каким-то образом обрезает первый бит URL-адреса. Например, когда я запрашиваю /admin/login/, информация о пути показывает только /login, но когда я использую runserver, она правильно передается как /admin/login. Для меня это явно проблема с настройкой веб-сервера, а не с сайтом django. Так что попробуем разобраться с A2Hosting...


person Zen    schedule 01.04.2018    source источник
comment
Итак, я выяснил, в чем проблема. Она действительно заключается в том, как A2Hosting управляет виртуальным хостом Apache и WSGI. Я сделал это, отладив заголовок HTTP в файле passanger_wsgi.py, и обнаружил, что SCRIPT_NAME и PATH_INFO не установлены правильно для запроса POST. Итак, в пассажире_wsgi.py я сделал следующее:   -  person Zen    schedule 06.04.2018


Ответы (1)


Похоже, вы, возможно, решили эту проблему, но для тех, кто может наткнуться здесь. Я использую A2Hosting, Passenger и 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)

Связанное чтение:

person RyanD    schedule 12.06.2018
comment
Привет @RyanD, это решение действительно сработало для меня. Я только что скопировал приведенный выше текст и поместил значение SCRIPT_NAME в путь к моему проекту django. И передал экземпляр приложения django.wsgi в указанном выше классе. И назвал весь файл наpassage_wsgi.py... Спасибо за это... Так как я застрял, когда поместил весь свой код на сервер A2Hosting..... Из-за этой ошибки в A2Hosting мой рабочий код не работал. .. Что заставило меня больше беспокоиться ..? К счастью, я нашел этот пост, и он помог мне... - person Gopal Prasad; 29.09.2018
comment
Привет, я нашел это только при публикации составного типа контента. Спасибо за чаевые. - person balsagoth; 17.02.2019