如何确定我的应用程序是否在开发服务器上运行?我想我可以检查settings.DEBUG
的值并假设DEBUG
是True
然后它在开发服务器上运行,但我更愿意确定而不是依赖约定。
答案 0 :(得分:38)
我在settings.py中添加了以下内容,以区分标准开发服务器和生产:
import sys
RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver')
然而,这也依赖于惯例。
(根据Daniel Magnusson的评论修改)
答案 1 :(得分:20)
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
部分搜索有趣的东西,所以我只是编辑我的回答证实了Nate的想法。
答案 2 :(得分:14)
通常我设置一个名为environment
的变量,并将其设置为“DEVELOPMENT”,“STAGING”或“PRODUCTION”。在设置文件中,我可以添加基本逻辑,根据环境更改正在使用的设置。
编辑此外,您只需使用此逻辑即可包含覆盖基本设置的不同settings.py
个文件。例如:
if environment == "DEBUG":
from debugsettings import *
答案 3 :(得分:8)
通常这有效:
FILE1 <- read.delim("example.txt", sep="\t", header = TRUE)
EXAMPLE_PLOT <- ggplot(FILE1, aes_string(x = colnames(FILE1)[1], y = colnames(FILE1)[2])) +
geom_point(size=4) +
ggtitle("EXAMPLE_PLOT") +
theme(plot.title = element_text(family="Calibri", color="black",
face="bold", size = 32, hjust=0)) +
theme(plot.background= element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank())+
theme(panel.background = element_blank())+
theme(axis.line.x = element_line(color="black", size = 1),
axis.line.y = element_line(color="black", size = 1))+
theme(axis.ticks = element_line(color="black", size = 1))+
theme(axis.ticks.length = unit(0.3,"cm"))+
theme(axis.title = element_text(family = "Calibri",
color="black", size=17, face="bold"))+
theme(axis.text.x = element_text(family = "Calibri", color="black",
size=14, face="bold"),
axis.text.y = element_text(family = "Calibri", color="black",
size=14, face="bold"))+
scale_x_log10(breaks=c(.01, .1, 1, 10, 100))+
scale_y_log10(breaks=c(.01, .1, 1, 10, 100))+
geom_smooth(method=lm)
EXAMPLE_PLOT
答案 4 :(得分:6)
依赖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上进行服务检查文件路径的人要比使用环境变量更容易。
答案 5 :(得分:4)
我刚才遇到了这个问题,最后写了一个类似于Aryeh Leib Taurog的解决方案。我的主要区别在于我想在运行服务器时区分生产环境和开发环境,还要为我的应用程序运行一些一次性脚本(我的运行方式如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 [你想要的任何选项] --in-development
并且运行我的脚本就像
一样简单DJANGO_SETTINGS_MODULE =设置python [myscript] --in-development
确保你传递的额外参数不会与任何django冲突(实际上我使用我的应用程序的名称作为参数的一部分)。 我认为这是相当不错的,因为它让我能够准确控制我的服务器和脚本何时表现为prod或dev,并且我不依赖于任何其他人的约定,而不是我自己的约定。
编辑:如果您传递无法识别的选项,manage.py会抱怨,因此您需要将settings.py中的代码更改为
if sys.argv[0] == 'manage.py' or '--in-development' in sys.argv:
# ...
pass
虽然这有效,但我认识到这不是最优雅的解决方案......
答案 6 :(得分:4)
如果要根据运行时环境自动切换设置文件 你可以使用环境不同的东西,例如
from os import environ
if environ.get('_', ''):
print "This is dev - not Apache mod_wsgi"
答案 7 :(得分:2)
settings.DEBUG可以是True并在Apache或其他非开发服务器下运行。它仍然会运行。据我所知,在运行时环境中没有任何内容可以检查pid并与操作系统中的pids进行比较,而这些pid将为您提供此信息。
答案 8 :(得分:2)
开发和部署环境之间的一个区别将是它正在运行的服务器。具体的不同取决于您的开发和部署环境。
了解您自己的开发和部署环境,可以使用HTTP请求变量来区分这两者。请查看request variables,例如request.META.HTTP_HOST
,request.META.SERVER_NAME
和request.META.SERVER_PORT
,并在两种环境中进行比较。
我打赌你会发现一些非常明显的东西,可以用来检测你的开发环境。在settings.py
中进行测试并设置一个可以在别处使用的变量。
答案 9 :(得分:2)
我用:
DEV_SERVERS = [
'mymachine.local',
]
DEVELOPMENT = platform.node() in DEV_SERVERS
需要注意机器上.node()
返回的内容。默认情况下,非开发非常重要,这样您就不会意外地暴露敏感的开发信息。
您还可以查看more complicated ways of uniquely identifying computers。
答案 10 :(得分:1)
受Aryeh的回答启发,我为自己设计的技巧是在sys.argv[0]
中查找管理脚本的名称:
USING_DEV_SERVER = "pulpdist/manage_site.py" in sys.argv[0]
(我的用例是在运行测试服务器时自动启用Django本机身份验证 - 在Apache下运行时,即使在开发服务器上,我当前项目的所有身份验证都通过Kerberos处理)
答案 11 :(得分:1)
您可以确定您是在WSGI
(mod_wsgi,gunicorn,女服务员等)与manage.py
(runserver,test,migrate等)或其他任何内容下运行:
import sys
WSGI = 'django.core.wsgi' in sys.modules
答案 12 :(得分:0)
您可以检查request.META["SERVER_SOFTWARE"]
的值:
dev_servers = ["WSGIServer", "Werkzeug"]
if any(server in request.META["SERVER_SOFTWARE"] for server in dev_servers):
print("is local")