如何判断我的Django应用程序是否在开发服务器上运行?

Imr*_*ran 51 python django wsgi

我怎样才能确定我的应用程序是否在开发服务器上运行?我想,我可以检查的价值settings.DEBUG,并假设如果DEBUGTrue那么它的开发服务器上运行,但我更愿意知道肯定不是依靠惯例.

Ary*_*rog 39

我在settings.py中添加以下内容以区分标准开发服务器和生产:

import sys
RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver')
Run Code Online (Sandbox Code Playgroud)

然而,这也依赖于惯例.

(根据Daniel Magnusson的评论修改)

  • 我必须在prod服务器上添加len(sys.argv)> 1:才能使其工作. (6认同)

ine*_*rte 20

server = request.META.get('wsgi.file_wrapper', None)
if server is not None and server.__module__ == 'django.core.servers.basehttp':
    print('inside dev')
Run Code Online (Sandbox Code Playgroud)

当然,wsgi.file_wrapper可能是在META上设置的,并且django.core.servers.basehttp在另一个服务器环境中有一个来自极端巧合命名的模块的类,但是我希望这将覆盖你.

顺便说一句,我发现这是通过在开发服务器上运行时创建一个无效的模板,Traceback并在Request information部分和部分上搜索有趣的东西,所以我只是编辑我的答案来证实Nate的想法.

  • +1实际上试图解决问题,即检测什么服务器正在提供Django应用程序,而不是依赖于设置.例如,没有什么能阻止某人在DEBUG模式下运行除了开发Web服务器之外的其他东西. (3认同)

Sov*_*iut 14

通常我设置一个名为的变量environment并将其设置为"DEVELOPMENT","STAGING"或"PRODUCTION".在设置文件中,我可以添加基本逻辑,以根据环境更改正在使用的设置.

编辑:此外,您可以简单地使用此逻辑来包含settings.py覆盖基本设置的不同文件.例如:

if environment == "DEBUG":
    from debugsettings import *
Run Code Online (Sandbox Code Playgroud)


Sve*_*nze 9

通常这有效:

import sys

if 'runserver' in sys.argv:
    # you use runserver
Run Code Online (Sandbox Code Playgroud)

  • 根据文档,您不应在生产环境中使用“runserver”。只要确保DEBUG使用正确即可;例如添加安全网和检查。 (2认同)

utk*_*tas 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()
Run Code Online (Sandbox Code Playgroud)

请注意,您可能也更喜欢使用@Soviut建议的环境变量进行检查.但是,正如在Windows上开发并在Linux上进行服务检查文件路径的人要比使用环境变量更容易.