【问题标题】:Django - distinguish development server (manage.py runserver) from the regular one (eg. Apache)Django - 将开发服务器(manage.py runserver)与常规服务器(例如 Apache)区分开来
【发布时间】:2012-06-13 07:56:33
【问题描述】:

我需要一种方法来将 Django 中的开发服务器(例如由 ./manage.py runserver 0.0.0.0:8000 运行)与在 Apache 上运行的开发服务器区分开来。对于 Apache,我使用 WSGI 守护程序模式,但我想找到一些更可靠的解决方案来检测 Django 开发服务器上的执行情况。

我目前使用的类似:

wsgi_wrapper = request.META.get('wsgi.file_wrapper')
wsgi_wrapper_path = wsgi_wrapper.__module__ if wsgi_wrapper else None

这似乎给了wsgi_wrapper_path存储:

  • wsgiref.util”字符串在Django内置开发服务器上运行时,
  • None 在 Apache / WSGI 上以守护模式运行时,

这里的问题是我不确定我是否可以依赖该检查(例如,如果生产/登台/开发服务器或我的本地主机配置发生更改)。我找不到任何相关的文档。

我需要该检查主要是因为 Django 的开发服务器存在一个问题:即使 HTTP 请求本身没有内容,它也会将请求的 CONTENT_TYPE (request.META['CONTENT_TYPE']) 设置为“text/plain”类型集(例如,它是一个GET 请求)。

任何关于 Django 的开发服务器检测(或解决请求内容类型不正确的问题)的想法都将不胜感激。谢谢。

附言。我基本上是在问这个问题:How can I tell whether my Django application is running on development server or not? for Django 1.4,试图确定在配置更改时足够可靠的解决方案。

【问题讨论】:

  • @YujiTomita:我的研究表明,结果与该问题的公认答案不同。另外,我已经更新了我的答案以包含该问题的链接。您链接的问题的公认答案不能解决问题(与我的结果略有不同),我需要该答案的更新版本、指向正确文档的一些链接或我可以使用的其他解决方案并让我高枕无忧。
  • 好吧,'runserver' in sys.argv 怎么样?然后在设置中设置一个标志?运行服务器 = 真。由于它仅用于开发,因此我个人会对此感到满意。
  • @YujiTomita:我没有考虑过,但是由于没有其他建议,我会考虑一下。问题在于,开发服务器不仅可以由./manage.py runserverpython manage.py runserver 运行,它还可能由其他东西执行(我正在使用 Fabric 执行各种任务,这样的场景是可能的)。我会对更清洁、更可靠的解决方案感到非常满意。但现在我怀疑是否有任何问题。
  • 你是什么意思 - 面料会有什么不同?如果有的话,它不会只是调用 manage.py runserver 吗?
  • @YujiTomita:我可能对此不够清楚。我的意思是你可以不通过调用./manage.py runserver 来运行开发服务器,而是执行./manage.py runserver 命令所做的事情(可能以修改的方式)。换句话说:1)在sys.argv 中有runserver 并不一定意味着您正在运行Django 的内部开发服务器,2)运行Django 的内部开发服务器并不一定会导致在sys.argv 中有runserver。我需要更可靠的东西。 (可选)我可以做各种事情,但是有什么方法可以区分开发服务器吗?

标签: django apache wsgi django-manage.py django-dev-server


【解决方案1】:

原则上——当使用生产服务器和开发服务器时,它们应该有不同的配置——最常见的是它们将使用不同的数据库、不同的邮件设置等。 因此,分辨服务器类型的最佳位置是配置。我可以指出两种最常用的方法:

  • 配置文件

然后在 settings.py 中添加:

server = config.get("SERVER_TYPE", "DEV")

并且 SERVER_TYPE 仅存在于 PRODUCTION 的配置文件中

  • 环境

在运行 Web 服务器时将 SERVER_TYPE 设置为环境变量。 IE。对于 Supervisord,运行网络服务器:

environment=SERVER_TYPE=PROD

或者对于 Apache:

SetEnv SERVER_TYPE PROD

这样你就可以确保只要你不混合配置文件,你总是会得到真正的服务器类型,不管你如何启动服务器。 至少这就是使用配置文件的原因。

【讨论】:

  • 你不是说os.environ 而不是config.get吗?
  • os.environ['SERVER_TYPE'] 将适用于第二种方法。我的意思是使用 ConfigParser 库从配置文件中读取。或任何其他从配置文件中读取的工具。
  • 我听从了您的建议,在生产服务器上设置了环境。如果没有其他方法(可能Apache已经设置了一些环境设置),那么我相信这是区分环境的最干净的方法(两种情况下的设置都是相同的,并且开发服务器不仅可以通过使用@987654326来调用@ 称呼)。谢谢。
  • 请注意:如果您使用的是mod_wsgi,则 Apache 中的 SetEnv 不会传递给 Django。因此,任何尝试应用该方法的人都应使用第一个选项或找到解决此问题的方法。
猜你喜欢
  • 2011-01-22
  • 1970-01-01
  • 2023-03-06
  • 2019-01-12
  • 1970-01-01
  • 2018-06-09
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多