我怎样才能确定我的应用程序是否在开发服务器上运行? 我想我可以检查
我在settings.py中添加以下内容以区分标准开发服务器和生产:
1 2 | import sys RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver') |
然而,这也依赖于惯例。
(根据Daniel Magnusson的评论修改)
- 我必须在prod服务器上添加len(sys.argv)> 1:才能使其工作。
- 这是更好的答案,因为它不需要请求。我想这样做有条件地连接媒体网址
- 你能解释一下这是为了什么吗?也许我不明白这个问题,但是这个变量存储是否使用manage.py runserver调用该站点,对吧?那你怎么办?我偶然发现了这篇文章,这似乎是我想要学习的新东西。我一直在寻找一种方法来检测我是否在本地主机上,在这种情况下转向DEBUG(我在这篇文章中没有找到关于此的答案)
1 2 3 | server = request.META.get('wsgi.file_wrapper', None) if server is not None and server.__module__ == 'django.core.servers.basehttp': print('inside dev') |
当然,
顺便说一句,我发现这是通过在开发服务器上运行时创建一个无效的模板,并在
- +1实际上试图解决问题,即检测哪些服务器正在提供Django应用程序,而不是依赖于设置。例如,没有什么能阻止某人在DEBUG模式下运行除了开发Web服务器之外的其他东西。
-
另一个特定于dev服务器的META字段:SERVER_SOFTWARE在dev上具有字符串
WSGIServer 和Python 以及您在HTTP服务器上"已部署"时配置的任何内容。 -
我会在第二行添加
getattr(server, '__module__', None) ,而不是直接使用点符号。你永远都不会知道... - 非常酷,但我想在启动时做一次,而不是每次请求。那可能吗?
-
@TalWeiss你可以将逻辑添加到
manage.py 和wsgi.py (或者与DRY保持一致,将逻辑添加到第三个文件,如setvars.py ,它被导入并被两者调用)。因此,使用像上面的答案或其他一个答案的逻辑,以调用os.environ.setdefault('DJANGO_SETTINGS_MODULE','some.settings.module') 的不同变体。这假设您将环境中的设置模块分成子模块。第二个想法,由于请求尚未设置,上面的答案将不起作用。但是你明白了。 -
在OS X上运行的Django 1.5.5中,模块名称为
wsgiref.util 。所以这个片段不起作用。 -
在Linux上的Django 1.8.12中,模块名称也是
wsgiref.util
通常我设置一个名为
编辑:此外,您可以简单地使用此逻辑来包含覆盖基本设置的不同
1 2 | if environment =="DEBUG": from debugsettings import * |
通常这有效:
1 2 3 4 | import sys if 'runserver' in sys.argv: # you use runserver |
依赖settings.DEBUG是AFAICS最优雅的方式,因为它偶尔也会在Django代码库中使用。
我想你真正想要的是一种自动设置该标志的方法,而无需在每次将项目上传到生产服务器时手动更新它。
为此,我检查settings.py的路径(在settings.py中)以确定项目运行的服务器:
1 2 3 4 5 6 | 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 的+1 :-)
如果要根据运行时环境自动切换设置文件
你可以使用环境不同的东西,例如
1 2 3 | from os import environ if environ.get('_', ''): print"This is dev - not Apache mod_wsgi" |
我刚才遇到了这个问题,最后写了一个类似于Aryeh Leib Taurog的解决方案。我的主要区别在于我想在运行服务器时区分生产环境和开发环境,还要为我的应用程序运行一些一次性脚本(我的运行方式如DJANGO_SETTINGS_MODULE = settings python [脚本])。在这种情况下,只需查看argv [1] == runserver是否足够。所以我想到的是在运行devserver时传递一个额外的命令行参数,当我运行我的脚本时,只需在settings.py中查找该参数。所以代码看起来像这样:
1 2 3 4 5 6 | 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冲突(实际上我使用我的应用程序的名称作为参数的一部分)。
我认为这是相当不错的,因为它让我可以准确控制我的服务器和脚本何时表现为prod或dev,并且我不依赖于任何其他人的约定,而不是我自己的约定。
1 2 3 | if sys.argv[0] == 'manage.py' or '--in-development' in sys.argv: # ... pass |
虽然这有效,但我认识到这不是最优雅的解决方案......
我用:
1 2 3 4 5 | DEV_SERVERS = [ 'mymachine.local', ] DEVELOPMENT = platform.node() in DEV_SERVERS |
这需要注意机器上
您还可以研究更复杂的方法来唯一识别计算机。
开发和部署环境之间的一个区别将是它正在运行的服务器。具体的不同取决于您的开发和部署环境。
了解您自己的开发和部署环境后,可以使用HTTP请求变量来区分这两者。查看请求变量,如
我打赌你会找到一些非常明显的东西,可以用来检测你的开发环境。在
settings.DEBUG可以是True并在Apache或其他非开发服务器下运行。它仍然会运行。据我所知,在运行时环境中没有任何内容可以检查pid并与操作系统中的pids进行比较,而这些pid将为您提供此信息。
您可以确定是否在
1 2 | import sys WSGI = 'django.core.wsgi' in sys.modules |
受Aryeh的回答启发,我为自己设计的技巧就是在
1 | USING_DEV_SERVER ="pulpdist/manage_site.py" in sys.argv[0] |
(我的用例是在运行测试服务器时自动启用Django本机身份验证 - 在Apache下运行时,即使在开发服务器上,我当前项目的所有身份验证都通过Kerberos处理)
你可以检查
1 2 3 | dev_servers = ["WSGIServer","Werkzeug"] if any(server in request.META["SERVER_SOFTWARE"] for server in dev_servers): print("is local") |