声明Django设置以与mod_wsgi / apache一起使用

时间:2017-04-27 17:14:15

标签: django apache mod-wsgi

我的Django项目中有多个设置文件(base.py,local.py,production.py)。

在本地,我通过

启动Django dev服务器
python manage.py runserver --settings=config.settings.local

如何告诉mod_wsgi使用相同的文件?我在我的本地apache实例上测试了这个,但是需要为我的生产apache实例找出相同的东西。

--settings=config.settings.production

当前的httpd-vhosts.conf:

WSGIDaemonProcess secureDash python-path=/Users/user/projects/secureDash_project/secureDash python-home=/Users/user/.venvs/securedash_py3.6
WSGIProcessGroup secureDash
WSGIScriptAlias / /Users/user/projects/secureDash_project/config/wsgi.py

我在apache日志中看到的错误:

ModuleNotFoundError: No module named 'secureDash.settings'

Django 1.11

的mod_wsgi-4.5.15

Apache 2.4.18

2 个答案:

答案 0 :(得分:0)

您可以通过设置DJANGO_SETTINGS_MODULE环境变量来完成此操作。您可以在Apache vhost配置中执行此操作,也可以在wsgi文件中执行此操作。

答案 1 :(得分:0)

我通过在每个环境中将DJANGO_SETTINGS_MODULE添加到我的secrets.json文件来解决这个问题。

secrets.json:

{
  "FILENAME": "secrets.json",
  "SECRET_KEY": "someSuperSecretiveSecret!",
  "DJANGO_SETTINGS_MODULE": "config.settings.local"
}

wsgi.py:

import json
from django.core.exceptions import ImproperlyConfigured
from pathlib import Path
...

# Directory Paths
BASE_DIR = Path(__file__).resolve().parent

# JSON-based secrets module
SECRETS_JSON = str(BASE_DIR) + '/secrets.json'

with open(SECRETS_JSON) as f:
    secrets = json.loads(f.read())


def get_secret(setting, secrets=secrets):
    '''Get the secret variable or return explicit exception'''
    try:
        return secrets[setting]
    except KeyError:
        error_msg = 'Set the {0} environment variable'.format(setting)
        raise ImproperlyConfigured(error_msg)


DJANGO_SETTINGS_MODULE = get_secret('DJANGO_SETTINGS_MODULE')

os.environ.setdefault("DJANGO_SETTINGS_MODULE", DJANGO_SETTINGS_MODULE)