如何确保我的应用程序是否在开发服务器上运行?我可以检查settings.DEBUG
的值并假设如果DEBUG
是True
,那么它正在运行开发服务器,但我更愿意确定而不是依赖惯例。
import sys
RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver')
这也依赖于惯例。
(根据Daniel Magnusson的评论进行了修正)
server = request.META.get('wsgi.file_wrapper', None)
if server is not None and server.__module__ == 'django.core.servers.basehttp':
print('inside dev')
当然,wsgi.file_wrapper
可能已经在META中设置,并且在另一个服务器环境中,它的类来自名为django.core.servers.basehttp
的模块,但我希望这可以解决您的问题。顺便说一下,我是通过在开发服务器上运行语法无效的模板,并搜索Traceback
和Request information
部分的有趣内容来发现这个问题的,所以我只是编辑我的答案来支持Nate的想法。manage.py
和 wsgi.py
中添加逻辑(或者按照DRY的原则,将逻辑添加到第三个文件中,比如 setvars.py
,然后由两个文件导入并调用)。因此,使用像上面答案中所示的逻辑或其他这些答案中的逻辑,以便调用不同版本的 os.environ.setdefault('DJANGO_SETTINGS_MODULE','some.settings.module')
。这假定您通过环境将设置模块分成子模块。 经过再次思考,上面的回答不会奏效,因为请求(request)尚未设置。但是你明白我的意思。 - floer32wsgiref.util
。因此,这段代码片段无法工作。 - Rockallitewsgiref.util
。 - ckot通常情况下,这个是有效的:
import sys
if 'runserver' in sys.argv:
# you use runserver
./manage.py runserver
而不是例如 ./manage.py shell_plus
吗? - shwz通常我会设置一个名为environment
的变量,并将其设置为"DEVELOPMENT"、"STAGING"或"PRODUCTION"。然后在设置文件中,我可以添加基本的逻辑来根据环境改变正在使用的设置。
编辑:此外,您还可以使用此逻辑包含不同的settings.py
文件来覆盖基础设置。例如:
if environment == "DEBUG":
from debugsettings import *
我认为最优雅的方式是依赖于settings.DEBUG,因为在Django代码库中也有时会使用它。
我猜你真正想要的是一种自动设置该标志的方法,而不需要每次将项目上传到生产服务器时手动更新它。
为了实现这一点,在settings.py中,我会检查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()
请注意,你可能更喜欢像@Soviut建议的那样使用环境变量进行此检查。但是作为一个在Windows上开发并在Linux上提供服务的人,检查文件路径比使用环境变量更容易。
WhereTheHellIsThisServedException
加一分 :-) - JWL您可以确定当前是在运行WSGI
(如mod_wsgi、gunicorn、waitress等)还是manage.py
(如runserver、test、migrate等)或其他内容:
import sys
WSGI = 'django.core.wsgi' in sys.modules
我刚刚遇到了这个问题,最终写出了与Aryeh Leib Taurog类似的解决方案。我的主要区别在于,当运行服务器时,我希望区分生产环境和开发环境,但是当运行一些应用程序的单次脚本时(我像这样运行:DJANGO_SETTINGS_MODULE=settings python [the script]),也需要区分环境。在这种情况下,仅查看argv[1] == runserver是否足够。所以我想到的办法是,在运行devserver时传递一个额外的命令行参数,并且在运行我的脚本时也是如此,并在settings.py中查找该参数。因此,代码如下:
if '--in-development' in sys.argv:
## YES! we're in dev
pass
else:
## Nope, this is prod
pass
if sys.argv[0] == 'manage.py' or '--in-development' in sys.argv:
# ...
pass
from os import environ
if environ.get('_', ''):
print "This is dev - not Apache mod_wsgi"
我使用:
DEV_SERVERS = [
'mymachine.local',
]
DEVELOPMENT = platform.node() in DEV_SERVERS
这需要注意在您的机器上通过.node()
返回的内容。默认设置为非开发模式非常重要,以避免意外暴露敏感的开发信息。
您还可以查看更复杂的唯一标识计算机的方法。
设置中的DEBUG可能为True并在Apache或其他非开发服务器下运行。它仍将运行。据我所知,除了检查pid并将其与操作系统中的pids进行比较之外,运行时环境中似乎没有任何信息可以提供这些信息。