代码之家  ›  专栏  ›  技术社区  ›  Steven Franklin

通过mod\u wsgi从apache传递环境变量以在django 1.11设置中使用

  •  1
  • Steven Franklin  · 技术社区  · 7 年前

    找到此问题的几个版本,例如 Django get environment variables from apache 然而,到目前为止我发现的建议似乎不适用于最新的LTS django(1.11)。

    我有一个apache配置,其中包含许多环境变量,不限于DB的连接凭据。我用它使我的代码在开发人员/产品等之间可移植。

    我的apache conf只使用SetEnv传递一些变量。

    我尝试了两种不同的方法来使用这些变量,两种方法似乎都有相同的问题;它需要先读取设置文件,然后才能写入环境,并且设置文件需要来自环境的值。

    我的两个变体是;

    import os
    import django
    from django.core.handlers.wsgi import WSGIHandler
    
    from django.core.wsgi import get_wsgi_application
    
    _application = get_wsgi_application()
    
    def application(environ, start_response):
      for key in [keys...]:
        if environ.get(key):
            os.environ[key] = environ.get(key)
      return _application(environ, start_response)
    

    import os
    import django
    from django.core.handlers.wsgi import WSGIHandler
    
    class WSGIEnvironment(WSGIHandler):
        def __call__(self, environ, start_response):
            for key in [keys...]:
                if environ.has_key(key):
                    print "Key: %s = %s" % (key,environ[key])
                    os.environ[key] = environ[key]
            return super(WSGIEnvironment, self).__call__(environ, start_response)
    
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", 'apiClient.settings')
    django.setup(set_prefix=False)
    application = WSGIEnvironment()
    

    无论哪种方式,我都试图使用设置中的值作为;

    KEY = "thing"
    
    if os.environ.has_key("KEY"):
        KEY = os.environ["KEY"]
    
    3 回复  |  直到 7 年前
        1
  •  4
  •   Graham Dumpleton    7 年前

    您不能使用 SetEnv 在处理第一个请求之前评估设置文件。从每个请求的WSGI环境值设置环境变量总是一个坏主意,可能会导致问题,所以无论如何都不应该这样做。

    结果是您无法从Apache配置文件中设置环境变量。从WSGI脚本文件中设置它们。如果它们是不应该添加到Git存储库中的内容,请在特定主机上创建一个具有某种格式的值的文件,并让WSGI脚本文件从本地主机读取该文件,以便在首次加载时和执行任何Django代码之前对其进行设置。

        2
  •  1
  •   Diego Araujo    5 年前

    对于Django>1.7 get\u wsgi\u应用程序调用django。setup(),用于初始化设置。因此,如果您的环境变量没有设置在该点上,您将无法在设置中看到它们。

    为了避免这种情况,在准备好之前不要调用get\u wsgi\u应用程序。这对我在wsgi中很有用。py:

    def application(environ, start_response):
        os.environ['APPLICATION_ENV'] = environ.get('APPLICATION_ENV', None)
        return get_wsgi_application()(environ, start_response)
    
        3
  •  0
  •   Alex    7 年前

    您必须将Django应用程序的初始化推迟到第一个请求。在wsgi中类似这样的内容。py:

    from django.core.wsgi import get_wsgi_application
    _application = None
    def application(environ, start_response):
        global _application
        if _application == None:
            for key in environ:
                if key.startswith('ENV_'):
                    os.environ[key[4:]] = environ[key]
            _application = get_wsgi_application()
        return _application(environ, start_response)
    

    遗憾的是,在mod\u wsgi中似乎没有选项可以在启动守护进程时设置初始环境,就像使用mod\u fastcgi一样。