DJANGO_SETTINGS_MODULE envar未设置

时间:2017-11-16 11:00:18

标签: python django apache ubuntu

我目前正在使用Apache2在生产服务器(Ubuntu 16.04)上开发Python 3.6和Django 1.11中的应用程序。

我正在尝试使用分离的设置进行生产和开发。我有一个带有基本设置的设置目录,以及生产和开发设置文件,而不是文件,它导入基本设置并可能覆盖它们。为了让Django知道要使用哪些设置,我将DJANGO_SETTINGS_MODULE设置为prehranske_oznacbe.settings.developmentprehranske_oznacbe.settings.production。这适用于开发。关于在生产服务器上设置envvars,我按照这两个SO的答案: Access Apache SetEnv variable from Django wsgi.py fileDjango + mod_wsgi. Set OS environment variable from Apache's SetEnv

问题是,当我尝试访问我的应用程序时,我收到500内部错误。 apache错误日志:

mod_wsgi (pid=404): Target WSGI script '/home/inesmersak/prehranske_oznacbe/prehranske_oznacbe/wsgi.py' cannot be loaded as Python module.
mod_wsgi (pid=404): Exception occurred processing WSGI script '/home/inesmersak/prehranske_oznacbe/prehranske_oznacbe/wsgi.py'.
Traceback (most recent call last):
   File "/home/inesmersak/prehranske_oznacbe/prehranske_oznacbe/wsgi.py", line 25, in <module>
     application = WSGIEnvironment()
   File "/home/inesmersak/prehranske_oznacbe/venv/lib/python3.5/site-packages/django/core/handlers/wsgi.py", line 151, in __init__
     self.load_middleware()
   File "/home/inesmersak/prehranske_oznacbe/venv/lib/python3.5/site-packages/django/core/handlers/base.py", line 48, in load_middleware
     if settings.MIDDLEWARE is None:
   File "/home/inesmersak/prehranske_oznacbe/venv/lib/python3.5/site-packages/django/conf/__init__.py", line 56, in __getattr__
     self._setup(name)
   File "/home/inesmersak/prehranske_oznacbe/venv/lib/python3.5/site-packages/django/conf/__init__.py", line 39, in _setup
     % (desc, ENVIRONMENT_VARIABLE))
django.core.exceptions.ImproperlyConfigured: Requested setting MIDDLEWARE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

好像envvar DJANGO_SETTINGS_MODULE没有设置好。我的代码:

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    Alias /static /home/inesmersak/prehranske_oznacbe/static
    <Directory /home/inesmersak/prehranske_oznacbe/static>
        Require all granted
    </Directory>

    <Directory /home/inesmersak/prehranske_oznacbe/prehranske_oznacbe>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>

    WSGIDaemonProcess prehranske_oznacbe python-path=/home/inesmersak/prehranske_oznacbe python-home=/home/inesmersak/prehranske_oznacbe/venv
    WSGIProcessGroup prehranske_oznacbe
    WSGIScriptAlias / /home/inesmersak/prehranske_oznacbe/prehranske_oznacbe/wsgi.py

    # Envvars for Django aplication 'Prehranske oznacbe'.
    SetEnv DJANGO_SETTINGS_MODULE prehranske_oznacbe.settings.production
    SetEnv OZNACBE_API_USERNAME (redacted)
    SetEnv OZNACBE_API_PASSWORD (redacted)
    SetEnv OZNACBE_SECRET_KEY (redacted)
</VirtualHost>

wsgi.py

import os
import django
from django.core.handlers.wsgi import WSGIHandler


class WSGIEnvironment(WSGIHandler):
    def __call__(self, environ, start_response):
        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'prehranske_oznacbe.settings.production')
        os.environ['DJANGO_SETTINGS_MODULE'] = environ['DJANGO_SETTINGS_MODULE']
        os.environ['OZNACBE_SECRET_KEY'] = environ['OZNACBE_SECRET_KEY']
        os.environ['OZNACBE_API_USERNAME'] = environ['OZNACBE_API_USERNAME']
        os.environ['OZNACBE_API_PASSWORD'] = environ['OZNACBE_API_PASSWORD']
        django.setup()
        return super(WSGIEnvironment, self).__call__(environ, start_response)

application = WSGIEnvironment()

1 个答案:

答案 0 :(得分:1)

SetEnv没有为WSGI应用程序设置进程范围的环境变量,它将environ字典中传递的每个请求WSGI环境变量设置为带有请求的WSGI应用程序。在Django初始化之后调用WSGI应用程序入口点,因此在那时设置os.environ为时已晚。在每个请求的基础上更新os.environ也被视为不良做法。使用单独的WSGI脚本文件会更好。

# production.wsgi

import os

os.environ['DJANGO_SETTINGS_MODULE'] = '....'
....

from prehranske_oznacbe.wsgi import application

按路径WSGIScriptAlias引用production.wsgi文件。