django - WSGI 如何获取调用它的 URL?
问题描述
我的问题似乎已在上一个问题中讨论过,但没有有效的答案。
我需要在 WSGI python 文件中,在实际启动 Django 之前,分析被调用的 URL 并“读取”它,这样我就可以知道是谁调用它并从中提取信息,我可以使用这些信息来确定我的 Django 应用程序将如何运行开始。
我有一个在 VM 上运行的应用程序,它从几个不同的 URL 调用,每个 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
每个 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 之前拥有变量
解决方案
推荐阅读
- ios - Agora Interactive Live Video Streaming - 如何在主播端启用音频?
- javascript - javascript数组显示数组的名称而不是内容(gtag,购买事件)
- docker - hadoop 环境中的 Hue 服务在几秒钟后崩溃
- html - 如何在我项目的所有 .html 中使用导航栏
- css - 有没有办法使用 CSS 为箭头形状添加边框?
- angularjs - AngularJS / rxjs:Observable 在订阅时未捕获错误
- android-studio - 将键盘映射分配给“提取到任意文件”灯泡命题
- python - 我们如何在多个 csv 文件中写入数据范围,并且应该从字典中获取数据
- mongodb - 如何在我试图查找包含查询中所有标签的文档时发出猫鼬查找请求
- api - 使用 API 网关保护云功能