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

声明Django设置以与mod_wsgi/apache一起使用,django,apache,mod-wsgi,Django,Apache,Mod Wsgi,我的Django项目中有多个设置文件(base.py、local.py、production.py) 在本地,我通过 python manage.py runserver --settings=config.settings.local 我如何告诉mod_wsgi使用相同的文件?我正在本地apache实例上测试这一点,但需要为我的生产apache实例找出同样的问题 --settings=config.settings.production 当前httpd-vhosts.conf: WSGID

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

在本地,我通过

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

您可以通过设置DJANGO_SETTINGS_MODULE环境变量来实现这一点。您可以在Apache vhost配置中或在wsgi文件本身中执行此操作。

您可以通过设置DJANGO_SETTINGS_MODULE环境变量来执行此操作。您可以在Apache vhost配置中或在wsgi文件本身中执行此操作。

我通过在每个环境中将DJANGO_SETTINGS_模块添加到我的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)

我通过在每个环境中将DJANGO_SETTINGS_模块添加到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)

我本来打算发布基本相同的内容,但为了实现它的价值,我最终创建了多个manage.py脚本,每个脚本指向不同的wsgi.py文件(例如,我有prod-manage.py/jenkins-manage.py/等,然后是相应的wsgi.py文件和设置…)我的首选是不必管理多个wsgi.py/manage.py脚本。Django的两个Scoops的作者建议不要使用Apache环境变量,而是建议使用“机密文件模式”。我已经通过一个JSON文件为我的密钥实现了这一点。出于对操作系统/服务器的不可知性以及只管理1个wsgi.py的考虑,也许我也会在该文件中设置DJANGO_SETTINGS_模块。您不能按照建议在Apache vhost配置中设置它。无法从Apache配置文件为Apache托管的WSGI应用程序设置流程环境变量。您只能设置在WSGI环境字典中传递的每个请求变量。这是不一样的。我本来打算发布基本相同的东西,但出于价值考虑,我最终创建了多个manage.py脚本,每个脚本指向不同的wsgi.py文件(例如,我有prod-manage.py/jenkins-manage.py/等,然后是相应的wsgi.py文件和设置…)我的首选是不必管理多个wsgi.py/manage.py脚本。Django的两个Scoops的作者建议不要使用Apache环境变量,而是建议使用“机密文件模式”。我已经通过一个JSON文件为我的密钥实现了这一点。出于对操作系统/服务器的不可知性以及只管理1个wsgi.py的考虑,也许我也会在该文件中设置DJANGO_SETTINGS_模块。您不能按照建议在Apache vhost配置中设置它。无法从Apache配置文件为Apache托管的WSGI应用程序设置流程环境变量。您只能设置在WSGI环境字典中传递的每个请求变量。这是不一样的。如果使用
os.environ.setdefault
,您应该小心,因为在一个进程中托管多个Django实例时,这可能会导致mod_wsgi出现问题。谢谢你的提醒。我对你在博客文章中所说的理解是,只要在apache vhost配置中设置了
WSGIDaemonProcess
,那么使用
os.environ.setdefault
应该是安全的。对吗?我有这一套,但为了安全起见,还将测试您的其他替代建议。除了
WSGIDaemonProcess
,您还需要确保只委派一个WSGI应用程序在该守护进程组中运行。如果允许一个守护进程组(在不同的子解释器中)中运行多个WSGI应用程序,则可能会出现相同的问题。因此,如果您只有一个Django站点,则可以,否则仍然需要小心。如果使用
os.environ.setdefault
,则应小心,因为在一个进程中托管多个Django实例时,这可能会导致mod_wsgi出现问题。谢谢你的提醒。我对你在博客文章中所说的理解是,只要在apache vhost配置中设置了
WSGIDaemonProcess
,那么使用
os.environ.setdefault
应该是安全的。对吗?我有这一套,但为了安全起见,还将测试您的其他替代建议。除了
WSGIDaemonProcess
,您还需要确保只委派一个WSGI应用程序在该守护进程组中运行。如果允许一个守护进程组(在不同的子解释器中)中运行多个WSGI应用程序,则可能会出现相同的问题。因此,如果你只有一个Django站点,那么就可以了,否则仍然需要小心。