应通过 os.environ 动态区分 Django 环境:统一入口 settings/__init__.py 根据 DJANGO_ENV 选择导入 dev/test/prod;共用配置抽至 base.py;SECRET_KEY、DATABASE_URL 等敏感配置必须从环境变量读取并校验;静态文件、缓存等需按环境差异化配置。

用 os.environ 区分开发、测试、生产环境
Django 默认只加载一个 settings.py,但实际项目必须按环境隔离配置(比如数据库地址、DEBUG 开关、密钥)。最直接的方式是靠系统环境变量驱动加载逻辑,而不是靠文件名或目录结构硬编码。
在项目根目录下新建 settings/ 目录,里面放 base.py、dev.py、prod.py 等,然后让 manage.py 和 wsgi.py 都通过 os.environ.get('DJANGO_SETTINGS_MODULE') 动态导入——但更稳妥的做法是统一入口只设一个 settings/__init__.py,在里面根据环境变量选择性导入:
import os
from pathlib import Path
<p>if os.environ.get('DJANGO_ENV') == 'prod':
from .prod import <em>
elif os.environ.get('DJANGO_ENV') == 'test':
from .test import </em>
else:
from .dev import *关键点:不要在 dev.py 里写 DEBUG = True 就完事,所有共用配置(如 INSTALLED_APPS、中间件顺序)应抽到 base.py,再用 from .base import * 继承,避免重复和遗漏。
SECRET_KEY 必须从环境变量读取,不能硬编码
本地开发可能图省事直接写死 SECRET_KEY,但一旦提交到 Git 或部署到服务器,就等于把密钥公开。Django 启动时如果检测到 DEBUG=False 且 SECRET_KEY 是默认值或空,会直接报错 SuspiciousOperation。
立即学习“Python免费学习笔记(深入)”;
正确做法是所有 settings 文件都通过 os.environ.get('SECRET_KEY') 获取,并加兜底校验:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
import os
SECRET_KEY = os.environ.get('SECRET_KEY')
if not SECRET_KEY:
raise ValueError("SECRET_KEY must be set in environment")- 开发环境可在
.env文件里写SECRET_KEY=xxx,用python-decouple或django-environ加载 - 生产环境务必用 systemd、Docker env 或云平台 secret 管理功能注入,绝不能出现在代码或配置文件中
- 注意:不同环境的
SECRET_KEY值必须不同,否则 session、CSRF token 会跨环境失效
数据库配置别用字符串拼接,优先用 django-environ
手动拼 DATABASES 字典容易出错,比如忘了转义密码里的特殊字符,或在生产环境误用 sqlite 路径。推荐用 django-environ 解析 DATABASE_URL:
import environ
env = environ.Env()
environ.Env.read_env()
<p>DATABASES = {
'default': env.db(),
}然后在环境变量里设:
- 开发:
DATABASE_URL=sqlite:///db.sqlite3 - 生产:
DATABASE_URL=postgres://user:pass@127.0.0.1:5432/mydb
它会自动处理 URL 解析、端口默认值、SSL 选项等。不用自己写正则或 urlparse,也避免因格式不一致导致 OperationalError: FATAL: database "xxx" does not exist 这类错误。
静态文件和媒体文件路径在不同环境行为差异极大
STATIC_ROOT 和 MEDIA_ROOT 在开发和生产环境下完全不是一回事:开发时 Django 自动 serve,生产必须由 Nginx 处理;而 STATICFILES_DIRS 在生产部署前要运行 collectstatic 才生效。
常见坑:
-
DEBUG=True时STATIC_URL可以是/static/,但生产必须指向 CDN 或绝对路径,比如https://cdn.example.com/static/ -
MEDIA_ROOT在开发可设为BASE_DIR / 'media',但生产必须确保 Web 服务器有读写权限,且不能放在 Web root 下(防用户上传任意脚本) - 用
whitenoise临时托管静态文件时,只适用于小项目;大项目务必配 Nginx 的location /static规则,否则500错误查半天发现是内存爆了
环境差异最大的其实是缓存后端:CACHES 在开发可用 LocMemCache,生产必须换 RedisCache 或 PyLibMC,且连接参数(超时、前缀)全得从环境变量来,不能写死。

















