代码之家  ›  专栏  ›  技术社区  ›  Imran

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

  •  51
  • Imran  · 技术社区  · 15 年前

    如何确定我的应用程序是否在开发服务器上运行?我想我可以查一下 settings.DEBUG 假设 DEBUG True 然后它在开发服务器上运行,但我更愿意确定地知道,而不是依赖约定。

    12 回复  |  直到 7 年前
        1
  •  20
  •   FlipperPA Gavin Ballard    8 年前
    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 部分,所以我只是在编辑我的答案来证实内特的想法。

        2
  •  36
  •   Aryeh Leib Taurog    10 年前

    我在settings.py中放置了以下内容,以区分标准dev服务器和产品:

    import sys
    RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver')
    

    然而,这也依赖于惯例。

    (根据Daniel Magnusson的评论修订)

        3
  •  14
  •   Soviut    8 年前

    通常我设置一个变量 environment 设置为“开发”、“分段”或“生产”。然后,在设置文件中,我可以添加基本逻辑,以根据环境更改正在使用的设置。

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

    if environment == "DEBUG":
        from debugsettings import *
    
        4
  •  7
  •   Sven R. Kunze    8 年前

    通常这是可行的:

    import sys
    
    if 'runserver' in sys.argv:
        # you use runserver
    
        5
  •  6
  •   utku_karatas    15 年前

    依赖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上服务的人,检查文件路径比使用环境变量简单得多。

        6
  •  4
  •   Luiz Scheidegger    13 年前

    我刚才遇到了这个问题,最后写了一个类似于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[您想要的任何选项]——在开发中

    运行我的脚本就像

    django_settings_module=settings python[myscript]——开发中

    只要确保你传递的额外论点不会与任何Django冲突(事实上,我使用我的应用程序的名字作为论点的一部分)。 我认为这是相当不错的,因为它让我能够准确地控制服务器和脚本的prod或dev行为,而且我不依赖于任何其他人的约定,除了我自己的约定。

    edit:manage.py在传递无法识别的选项时会抱怨,因此需要将settings.py中的代码更改为

    if sys.argv[0] == 'manage.py' or '--in-development' in sys.argv:
        # ...
        pass
    

    虽然这是可行的,但我知道这不是最优雅的解决方案…

        7
  •  3
  •   none    12 年前

    如果要根据运行时环境自动切换设置文件 你可以只使用不同环境的东西,例如

    from os import environ
    if environ.get('_', ''): 
        print "This is dev - not Apache mod_wsgi"         
    
        8
  •  2
  •   hughdbrown    15 年前

    settings.debug可以为true,并在Apache或其他非开发服务器下运行。它仍然会运行。据我所知,在运行时环境中,除了检查pid并将其与OS中的pid进行比较之外,什么都没有。

        9
  •  2
  •   Nate    15 年前

    开发环境和部署环境之间的一个区别是运行它的服务器。具体的不同之处将取决于您的开发和部署环境。

    了解自己的开发和部署环境后,可以使用HTTP请求变量来区分这两者。看 request variables 喜欢 request.META.HTTP_HOST , request.META.SERVER_NAME request.META.SERVER_PORT 并在两种环境中进行比较。

    我打赌你会发现一些非常明显的不同的东西,可以用来检测你的开发环境。做测试 settings.py 并设置一个可以在其他地方使用的变量。

        10
  •  2
  •   Carl G    12 年前

    我使用:

    DEV_SERVERS = [
        'mymachine.local',
    ]
    
    DEVELOPMENT = platform.node() in DEV_SERVERS
    

    这需要注意返回的内容 .node() 在你的机器上。重要的是,默认值是非开发的,这样您就不会意外地暴露敏感的开发信息。

    你也可以调查 more complicated ways of uniquely identifying computers .

        11
  •  1
  •   ncoghlan    12 年前

    受Aryeh答案的启发,我为自己设计的技巧就是在 sys.argv[0] :

    USING_DEV_SERVER = "pulpdist/manage_site.py" in sys.argv[0]
    

    (我的用例是在运行测试服务器时自动启用Django本机身份验证-在Apache下运行时,甚至在开发服务器上,我当前项目的所有身份验证都是通过Kerberos处理的)

        12
  •  1
  •   OrangeDog    7 年前

    你可以确定你是否在 WSGI (mod_wsgi、gunicorn、服务员等)与 manage.py (运行服务器、测试、迁移等)或其他:

    import sys
    WSGI = 'django.core.wsgi' in sys.modules