Django-区分开发服务器(manage.py runserver)和常规服务器(如Apache)

Django-区分开发服务器(manage.py runserver)和常规服务器(如Apache),django,apache,wsgi,django-manage.py,django-dev-server,Django,Apache,Wsgi,Django Manage.py,Django Dev Server,我需要一种方法来区分Django中的开发服务器(例如通过/manage.py运行runserver 0.0.0.0:8000)和Apache上运行的开发服务器。对于Apache,我使用WSGI守护进程模式,但我想找到一些更可靠的解决方案来检测Django开发服务器上的执行情况 我目前使用的类似于: wsgi\u wrapper=request.META.get('wsgi.file\u wrapper')) wsgi_包装器_路径=wsgi_包装器。_模块_;如果wsgi_包装器其他无 这似乎

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

我目前使用的类似于:

wsgi\u wrapper=request.META.get('wsgi.file\u wrapper'))
wsgi_包装器_路径=wsgi_包装器。_模块_;如果wsgi_包装器其他无
这似乎给出了
wsgi\u包装器\u路径
存储:

  • wsgiref.util
    ”字符串在Django的内置开发服务器上运行时
  • None
    在守护进程模式下在Apache/WSGI上运行时
这里的问题是,我不确定是否可以依赖该检查(例如,如果生产/登台/开发服务器或本地主机配置发生更改)。我找不到任何有关这方面的文件

我需要检查,主要是因为Django的开发服务器有一个问题:它将请求的
内容类型设置为“
request.META['CONTENT\u TYPE']
”,即使HTTP请求本身没有设置内容类型(例如,它是一个
GET
请求)

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


注:我基本上是在问这个问题:对于Django 1.4,试图确定在配置发生变化时足够可靠的解决方案。

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

  • 配置文件
然后在settings.py中添加:

server = config.get("SERVER_TYPE", "DEV")
并且仅在生产时的配置文件中包含服务器类型

  • 环境
运行web服务器时,将服务器类型设置为环境变量。即,对于Supervisord,运行Web服务器:

environment=SERVER_TYPE=PROD
或者对于Apache:

SetEnv SERVER_TYPE PROD
通过这种方式,您可以确保,只要不混合配置文件,无论您如何启动服务器,都将始终获得真正的服务器类型。
至少这就是为什么要使用配置文件。

@YujiTomita:我的研究表明,结果与公认的答案不同。另外,我已经更新了我的答案,加入了这个问题的链接。您链接的问题的公认答案无法解决问题(与我的结果略有不同),我需要该答案的更新版本、适当文档的某些链接或其他我可以使用且放心的解决方案。那么,sys.argv中的
'runserver'如何?然后在设置中设置一个标志?RUNSERVER=True。因为这只是为了发展,我个人会很高兴的。@YujiTomita:我还没有考虑过,但是因为没有其他的建议,我会考虑的。它的问题是,开发服务器可能不仅由
/manage.py runserver
python manage.py runserver
运行,还可能从其他地方执行(我正在使用Fabric执行各种任务,这样的场景是可能的)。我真的很高兴有更干净、更可靠的解决方案。但现在我怀疑是否有。你是什么意思?面料会有什么不同?如果有什么问题的话,它不就叫manage.py runserver吗?@YujiTomita:我可能还不够清楚。我的意思是,您可能不需要调用
/manage.py runserver
,而可以像
/manage.py runserver
命令那样运行开发服务器(可能是以修改的方式)。换句话说:1)在
sys.argv
中运行
runserver
并不一定意味着您正在运行Django的内部开发服务器,2)运行Django的内部开发服务器不一定会导致在
sys.argv
中运行
runserver
。我需要更可靠的东西。或者我可以做各种事情,但是有没有办法区分dev服务器?你不是说
os.environ
而不是
config.get
?os.environ['server\u TYPE']将适用于第二种方法。我的意思是使用ConfigParser库读取配置文件。或者任何其他工具来读取配置文件。我按照您的建议在生产服务器上设置环境。如果没有其他方法(可能是Apache已经设置了一些环境设置),那么我相信这是区分环境的最干净的方法(两种情况下的设置都是相同的,并且不仅可以使用
/manage.py runserver
调用调用development server)。谢谢。请注意:如果您使用的是
mod_wsgi
,则Apache中的
SetEnv
不会传递给Django。所以,任何试图应用这种方法的人都应该使用第一种选择,或者找到解决这个问题的方法。