Python 如何判断Django应用程序是否在开发服务器上运行?
我如何确定我的应用程序是否在开发服务器上运行?我想我可以检查Python 如何判断Django应用程序是否在开发服务器上运行?,python,django,wsgi,Python,Django,Wsgi,我如何确定我的应用程序是否在开发服务器上运行?我想我可以检查设置的值。DEBUG并假设如果DEBUG为True则它在开发服务器上运行,但我更愿意确定它是否在依赖约定。settings.DEBUG可能为True,并在Apache或其他非开发服务器下运行。它仍将运行。据我所知,在运行时环境中,除了检查pid并将其与操作系统中的pid进行比较之外,没有什么可以为您提供这些信息。开发环境和部署环境之间的一个区别是它运行的服务器。具体的区别取决于您的开发和部署环境 了解您自己的开发和部署环境后,可以使用H
设置的值。DEBUG
并假设如果DEBUG
为True
则它在开发服务器上运行,但我更愿意确定它是否在依赖约定。settings.DEBUG可能为True,并在Apache或其他非开发服务器下运行。它仍将运行。据我所知,在运行时环境中,除了检查pid并将其与操作系统中的pid进行比较之外,没有什么可以为您提供这些信息。开发环境和部署环境之间的一个区别是它运行的服务器。具体的区别取决于您的开发和部署环境
了解您自己的开发和部署环境后,可以使用HTTP请求变量来区分两者。查看像request.META.HTTP\u HOST
、request.META.SERVER\u NAME
和request.META.SERVER\u PORT
,并在两个环境中比较它们
我打赌您会发现一些非常明显的不同之处,可以用来检测您的开发环境。在settings.py中进行测试,并设置一个可在其他地方使用的变量
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\u wrapper
可能是在META上设置的,并且在另一个服务器环境中非常巧合地拥有一个名为django.core.servers.basehttp
的模块中的类,但我希望这能让您有所了解
顺便说一句,我在开发服务器上运行时创建了一个语法无效的模板,并在回溯
和请求信息
部分搜索了一些有趣的内容,从而发现了这一点,所以我只是编辑我的答案来证实内特的观点。通常我设置一个名为environment
的变量,并将其设置为“开发”、“暂存”或“生产”。在设置文件中,我可以添加基本逻辑,根据环境更改正在使用的设置
编辑:此外,您可以简单地使用此逻辑来包括覆盖基本设置的不同设置.py
文件。例如:
if environment == "DEBUG":
from debugsettings import *
依赖settings.DEBUG是AFAICS最优雅的方式,因为它有时也用于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上服务的人来说,检查文件路径显然比使用环境变量更容易。我在我的settings.py中添加了以下内容,以区分标准的开发服务器和产品:
import sys
RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver')
然而,这也取决于惯例
(根据Daniel Magnusson的评论进行修订)我刚才遇到了这个问题,最后编写了一个类似于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
然后,运行django服务器就变成了
python manage.py runserver[您想要的任何选项]——正在开发中
运行我的脚本就像
DJANGO_SETTINGS_MODULE=SETTINGS python[myscript]--正在开发中
只需确保您传递的额外参数与django的任何内容都不冲突(实际上,我使用我的应用程序名称作为参数的一部分)。
我认为这相当不错,因为它让我能够准确地控制我的服务器和脚本何时作为prod或dev运行,并且除了我自己的约定之外,我不依赖任何其他人的约定
编辑:如果传递了无法识别的选项,manage.py会抱怨,因此需要将settings.py中的代码更改为
if sys.argv[0] == 'manage.py' or '--in-development' in sys.argv:
# ...
pass
虽然这是可行的,但我认识到它不是最优雅的解决方案…受Aryeh答案的启发,我为自己设计的诀窍是在sys.argv[0]
中查找我的管理脚本的名称:
USING_DEV_SERVER = "pulpdist/manage_site.py" in sys.argv[0]
(我的用例是在运行测试服务器时自动启用Django本机身份验证-在Apache下运行时,即使在开发服务器上,我当前项目的所有身份验证都是通过Kerberos处理的)我使用:
DEV_SERVERS = [
'mymachine.local',
]
DEVELOPMENT = platform.node() in DEV_SERVERS
这需要注意机器上的.node()
返回的内容。重要的是,默认设置为非开发,这样您就不会意外地公开敏感的开发信息
如果要根据运行时环境自动切换设置文件,也可以查看。
你可以使用环境不同的东西,例如
from os import environ
if environ.get('_', ''):
print "This is dev - not Apache mod_wsgi"
通常这是有效的:
import sys
if 'runserver' in sys.argv:
# you use runserver
您可以确定您是在WSGI
(mod_WSGI、gunicorn、waiteress等)下运行,还是在manage.py
(runserver、test、migrate等)下运行,还是在其他任何情况下运行:
import sys
WSGI = 'django.core.wsgi' in sys.modules
您可以检查request.META[“服务器软件”]
值:
dev_servers = ["WSGIServer", "Werkzeug"]
if any(server in request.META["SERVER_SOFTWARE"] for server in dev_servers):
print("is local")
+1用于实际尝试解决问题,即检测为Django应用程序提供服务的服务器,而不是依赖于设置。例如,除了开发web服务器之外,没有任何东西可以阻止某人在调试模式下运行