首页 > 解决方案 > WSGI 如何获取调用它的 URL?

问题描述

我的问题似乎已在上一个问题中讨论过但没有有效的答案。

我需要在 WSGI python 文件中,在实际启动 Django 之前,分析被调用的 URL 并“读取”它,这样我就可以知道是谁调用它并从中提取信息,我可以使用这些信息来确定我的 Django 应用程序将如何运行开始。

我有一个在 VM 上运行的应用程序,它从几个不同的 URL 调用,每个 URL 指向不同的 WSGI 文件,都在 Django 中运行完全相同的代码,但使用不同的“DJANGO_SETTINGS_MODULE”文件。调用我的应用程序的每个 URL 的不同设置文件。这是一个我无法更改的遗留项目。目前,它是这样运作的:

每个 URL 调用不同的 WSGI 文件,它们都运行同一个项目,但将变量设置为适当的 SETTINGS。

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

我们正在远离我们的虚拟机当前所在的亚马逊,并计划改用 Google AppEngine,但如果使用相同的项目,我们不太确定如何根据调用的 URL 指向不同的设置文件/版本。

我们可以简单地为每个 URL 使用不同版本的 AppEngine,然后将 URL 称为“user1-dot-example.appspot.com”,将设置文件硬编码到每个版本的 wsgi 上……但这需要为每个 URL 启动不同的实例。

期望能够在启动 Django 应用程序之前,在通过 URL 'user1.example.com' 访问我的应用程序时获取字符串'user1',并在通过 URL 'user2.example 访问我的应用程序时获取字符串'user2' .com'(原始 URL,将使用 CloudFlare 重定向到 AppEngine),所以我可以这样做:

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 是否可以检索调用 API 的 URL?或者甚至可能是 gunicorn 将其传递给变量中的 WSGI 的一种方式,以某种方式获取“$URL”变量并执行以下操作:

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

甚至从 AppEngine 将 URL 放入 app.yaml 中的环境的方法已经解决了这个问题。所需要的只是在使用 DJANGO_SETTINGS_MODULE 实际设置 Django 之前拥有变量

标签: djangopython-3.xgoogle-app-enginegunicornwsgi

解决方案


推荐阅读