Как WSGI может получить URL, который вызвал его? - PullRequest
0 голосов
/ 06 ноября 2019

Кажется, моя проблема обсуждалась в предыдущем вопросе здесь , но у нее не было рабочего ответа.

Мне нужно в файле Python WSGI, прежде чем фактически запустить Django, проанализироватьURL, который был вызван, и «прочитал» его, поэтому я могу знать, кто его вызвал, и извлечь из него информацию, которую я могу использовать, чтобы определить, как будет запущено мое приложение Django.

У меня есть приложение, работающее наВиртуальная машина, которая вызывается из нескольких разных URL-адресов, каждый из которых указывает на отдельный файл WSGI, и все они выполняют один и тот же код в Django, но используют разные файлы 'DJANGO_SETTINGS_MODULE'. Различный файл настроек для каждого URL, который вызывает мое приложение. Это устаревший проект, который я не могу изменить. В настоящее время это работает следующим образом:

  • User1 обращается к 'user1.example.com'> WSGI устанавливает DJANGO_SETTINGS_MODULE в settings_user1> WSGI запускает Django
  • User2 осуществляет доступ 'user2.example.com'> WSGI устанавливает DJANGO_SETTINGS_MODULE в settings_user2> WSGI запускает Django
  • User3 осуществляет доступ' user3.example.com '> WSGI устанавливает DJANGO_SETTINGS_MODULE в settings_user3> WSGI запускает Django
* 1016 для 1016 *1015*

1016 *1016* 1016 *1016* 1016 *1016* 1016 *1016* 1016 * 1016 для 101другой WSGI-файл, все запускают один и тот же проект, но устанавливают для переменной соответствующие УСТАНОВКИ.

from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings_user1")
application = get_wsgi_application()

Мы уходим из Amazon, где в настоящее время находится наша виртуальная машина, и вместо этого планируем использовать Google AppEngine. , но мы не совсем уверены, как указать другой файл настроек в зависимости от вызываемого URL, если используется один и тот же проект / версия.

Мы можем просто использовать разные версии нашего AppEngine для каждого URL-адреса, а затем назначить URL-адрес «user1-dot-example.appspot.com», жестко запрограммировав файл настроек в wsgi для каждой версии. ... но это потребует запуска разных экземпляров для каждого URL.

Ожидается, что перед запуском приложения Django можно будет получить строку 'user1' при доступе к моему приложению через URL 'user1.example.com'и строку' user2 'при доступе к моему приложению через URL' user2.example.com '(исходный URL, который будет перенаправлен в AppEngine с использованием CloudFlare), поэтому я могу сделать что-то вроде этого:

from django.core.wsgi import get_wsgi_application
url = SOME_CODE_THAT_GETS_THE_URL_HERE()
user = url.split('.example.com')[0]
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings_{}".format(user))
application = get_wsgi_application()

Есть ли в любом случае WSGI может получить URL, который вызвал API? Или, возможно, даже способ для gunicorn передать его в WSGI в переменной, получить переменную '$ URL' и сделать что-то вроде этого:

gunicorn -b :$PORT wsgi:create_app(url=$URL)

Или даже способ получить URL вокружение в app.yaml из AppEngine уже решило бы проблему. Все, что нужно, это иметь переменную до того, как Django будет фактически настроен с DJANGO_SETTINGS_MODULE

...