我怎么知道我的Django应用程序是否在开发服务器上运行?
我如何确定我的应用程序是否在开发服务器上运行? 我想我可以检查settings.DEBUG
值,并假设如果DEBUG
为True
那么它在开发服务器上运行,但我宁愿知道肯定比依靠约定。
server = request.META.get('wsgi.file_wrapper', None) if server is not None and server.__module__ == 'django.core.servers.basehttp': print('inside dev')
当然,可以在META上设置wsgi.file_wrapper
,并且在另一个服务器环境中有一个名为django.core.servers.basehttp
的模块,但是我希望能够覆盖这个类。
顺便说一下,我通过在开发服务器上运行一个合成无效的模板来发现这一点,并且在Traceback
和Request information
部分search了有趣的东西,所以我只是编辑我的答案以证实Nate的想法。
我把我的settings.py中的以下内容区分开标准的dev服务器和生产:
import sys RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver')
然而,这也依赖于惯例。
(根据Daniel Magnusson的评论修改)
通常我会设置一个名为environment
的variables,并将其设置为“开发”,“分段”或“生产”。 在设置文件中,我可以根据环境添加基本逻辑来更改正在使用的设置。
编辑:另外,你可以简单地使用这个逻辑来包含覆盖基本设置的不同的settings.py
文件。 例如:
if environment == "DEBUG": from debugsettings import *
依靠settings.DEBUG是AFAICS最优雅的方式,因为它也在Django代码基础中使用。
我想你真正想要的是自动设置该标志的方法,而不需要每次将项目上传到生产服务器时都手动更新。
为此,我检查了settings.py的path(在settings.py中)以确定项目在哪个服务器上运行:
if __file__ == "path to settings.py in my development machine": DEBUG = True elif __file__ in [paths of production servers]: DEBUG = False else: raise WhereTheHellIsThisServedException()
请注意,您可能还喜欢使用@Soviutbuild议的环境variables进行检查。 但是随着在Windows上开发和在Linux上检查文件path的人比使用环境variables更容易。
刚才我遇到了这个问题,最后写了一个类似于Aryeh Leib Taurog的解决scheme。 我的主要区别在于,我想在运行服务器时区分生产环境和开发环境,而且为我的应用程序运行一些一次性脚本(我像DJANGO_SETTINGS_MODULE = settings python [脚本]一样运行)。 在这种情况下,仅仅看argv [1] == runserver是不够的。 所以我想到的是在运行devserver时传递一个额外的命令行参数,而且当我运行我的脚本时,只需在settings.py中查找这个参数即可。 所以代码如下所示:
if '--in-development' in sys.argv: ## YES! we're in dev pass else: ## Nope, this is prod pass
然后,运行django服务器变成
python manage.py runserver [你想要的任何选项] – 在开发中
并运行我的脚本是一样容易
DJANGO_SETTINGS_MODULE =设置python [myscript] – 在开发中
只要确保你传递的额外参数不会与任何django冲突(实际上我使用我的应用程序的名字作为参数的一部分)。 我认为这是相当不错的,因为它可以让我准确地控制我的服务器和脚本的行为如何,而不是依赖于其他任何人的约定。
编辑:manage.py抱怨,如果你通过无法识别的选项,所以你需要改变settings.py中的代码是类似
if sys.argv[0] == 'manage.py' or '--in-development' in sys.argv: # ... pass
虽然这有效,但我认识到这不是最优雅的解决scheme。
通常这工作:
import sys if 'runserver' in sys.argv: # you use runserver
settings.DEBUG可能为True,并在Apache或其他非开发服务器上运行。 它仍然会运行。 据我所知,在运行时环境中没有任何东西没有检查pid,而是与操作系统中的pid比较,这会给你提供这些信息。
开发和部署环境之间的一个区别就是它运行的服务器。 什么是不同的将取决于你的开发和部署环境。
了解你自己的开发和部署环境,可以使用HTTP请求variables来区分这两者。 查看请求variables,如request.META.HTTP_HOST
, request.META.SERVER_NAME
和request.META.SERVER_PORT
,并在两种环境中进行比较。
我敢打赌,你会发现很明显的不同,可以用来检测你的开发环境。 在settings.py
进行testing,并设置一个可以在别处使用的variables。
如果你想根据运行环境自动切换你的设置文件,你可以使用一些不同的环境,例如
from os import environ if environ.get('_', ''): print "This is dev - not Apache mod_wsgi"
受到Aryeh的回答的启发,我为自己devise的技巧是在sys.argv[0]
查找我的pipe理脚本的名称:
USING_DEV_SERVER = "pulpdist/manage_site.py" in sys.argv[0]
(我的用例是在运行testing服务器时自动启用Django本地身份validation – 当在Apache下运行时,甚至在开发服务器上,我当前项目的所有身份validation都通过Kerberos进行处理)
我用:
DEV_SERVERS = [ 'mymachine.local', ] DEVELOPMENT = platform.node() in DEV_SERVERS
这需要注意你的机器上的.node()
返回的内容。 默认设置为非开发非常重要,这样您才不会意外暴露敏感的开发信息。
你也可以看看更复杂的唯一识别计算机的方法 。