Django + mod_wsgi。从Apache的SetEnv设置OS环境变量

发布于 2021-01-29 14:58:41

我需要拆分Django的开发和生产设置。我决定,如果USKOVTASK_PROD设置了变量,则应用程序应使用生产设置。我阅读了这篇文章,并试图做到这一点。

我的摘要:

/etc/apache2/sites-enabled/uskovtask.conf:

<VirtualHost *:80>

ServerName uskovtask.*.com
ServerAlias uskovtask.*.com
DocumentRoot /mnt/ebs/uskovtask


Alias /static /mnt/ebs/uskovtask/static/
<Directory /mnt/ebs/uskovtask/static>
    Require all granted
</Directory>

#WSGIPythonPath /mnt/ebs/uskovtask
WSGIDaemonProcess uskovtask.*.com python-path=/mnt/ebs/uskovtask:/usr/lib/python2.7/site-packages
WSGIProcessGroup uskovtask.*.com
WSGIScriptAlias / /mnt/ebs/uskovtask/uskovtask/wsgi.py
SetEnv USKOVTASK_PROD 1


<Directory /mnt/ebs/uskovtask/uskovtask>
<Files wsgi.py>
    Require all granted
</Files>
</Directory>

</VirtualHost>

wsgi.py:

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "uskovtask.settings")

from django.core.wsgi import get_wsgi_application

_application = get_wsgi_application()

def application(environ, start_response):
    if 'USKOVTASK_PROD' in environ:
        os.environ.setdefault('USKOVTASK_PROD', environ['USKOVTASK_PROD'])
    return _application(environ, start_response)

settings.py的一部分:

import os

if 'USKOVTASK_PROD' in os.environ:
    from settings_prod import *
else:
    from settings_dev import *

但是它总是导入settings_dev的设置。为什么?

关注者
0
被浏览
88
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这与来自Django wsgi.py文件的问题Access Apache
    SetEnv变量有关

    您需要按照答案所述继承WSGIHandler。

    正如格雷厄姆·邓普尔顿(Graham Dumpleton)在第二个答案中所解释的那样,

    综上所述,您提到的博客文章通常无济于事。这是因为它正在使用基于在Apache中使用SetEnv设置的每个请求WSGI环境设置为每个请求设置进程环境变量的讨厌技巧。如果环境变量的值可以根据URL上下文而有所不同,则这可能在多线程配置中引起各种问题。对于Django而言,这没有帮助,因为通常会在处理任何请求之前导入Django设置模块,这意味着环境变量在需要的时间将不可用。

    我认为这就是您的情况。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看