Django 配置位于 settings.py,但实际应用需要每个环境的不同设置(开发、暂存、生产)并且必须将密钥保留在代码之外。正确管理这一点既是操作必需的,也是安全要求。
单个 settings.py 的问题
DEBUG =
SECRET_KEY =
DATABASES = {: {: }}
将值硬编码会混合环境,更重要的是——将密钥(SECRET_KEY、数据库密码、API 密钥)提交到版本控制中,这是一个严重的安全漏洞。
import os
from pathlib import Path
SECRET_KEY = os.environ["DJANGO_SECRET_KEY"] # from the environment, NOT code
DEBUG = os.environ.get("DJANGO_DEBUG", "False") == "True"
ALLOWED_HOSTS = os.environ.get("ALLOWED_HOSTS", "").split(",")
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": os.environ["DB_NAME"],
"PASSWORD": os.environ["DB_PASSWORD"], # injected per environment
}
}
# tools like django-environ / python-decouple make this cleaner (+ .env file support)
从环境变量读取配置(特别是密钥)可以将其保留在代码之外——相同的代码库在任何环境中运行时可以注入不同的值(十二因素方法)。
settings/
base.py # shared settings (apps, middleware, templates)
development.py # from base import *; DEBUG=True, local DB, debug toolbar
production.py # from base import *; DEBUG=False, security hardening, real DB
test.py # test-specific settings
# production.py
from .base import *
DEBUG = False
ALLOWED_HOSTS = ["example.com"]
SECURE_SSL_REDIRECT = True # production-only security settings
# select via: DJANGO_SETTINGS_MODULE=config.settings.production
将设置分割为共享 base.py 加每个环境的文件(通过 DJANGO_SETTINGS_MODULE 选择)能够干净地分离特定于环境的配置,同时共享常见设置。
DEBUG = False # ❗ NEVER True in production — leaks sensitive error info
ALLOWED_HOSTS = ["example.com"] # required when DEBUG=False
SECRET_KEY = os.environ[...] # strong, secret, from the environment
# + SECURE_SSL_REDIRECT, SESSION_COOKIE_SECURE, HSTS, etc. for hardening
✓ NEVER commit secrets — use env vars / a secret manager; gitignore .env
✓ DEBUG=False in production (DEBUG=True leaks tracebacks, settings → security risk)
✓ Commit a .env.example documenting required variables (no real values)
跨环境管理设置既是操作必需的,也是任何真实 Django 应用的关键安全实践。
应用在不同环境中必须表现不同——开发需要 DEBUG=True 和便利的本地设置,而生产需要 DEBUG=False、安全加固、真实数据库和适当的主机——单个硬编码的 settings.py 无法满足所有这些需求。
更重要的是,这是一个重大安全隐患:硬编码密钥(SECRET_KEY、数据库密码、API 密钥)会将它们提交到版本控制中,这是最常见和最严重的安全漏洞之一(任何有仓库访问权限的人,或在公开仓库中,都会获得你的应用和数据的密钥)。
理解解决方案——从环境变量读取配置和密钥(将其保留在代码之外,十二因素方法,通常使用 django-environ 等工具和被 gitignore 的 .env 文件)并分割设置为共享基础加每个环境的文件——对于安全正确地部署 Django 是必不可少的。
了解关键生产设置(特别是在生产中 DEBUG 必须为 False,因为 DEBUG=True 会向攻击者泄露追踪记录、源代码路径和设置,加上 ALLOWED_HOSTS 和安全加固)是不可协商的生产知识。
正确处理设置管理——将密钥放在环境中、适合环境的配置、安全的生产默认值——是专业运行 Django 应用和避免因泄露的密钥或配置错误的生产环境而造成的严重漏洞的基础,使其成为任何真实部署的重要的、实际关键的知识。