自动化切换local.py与prod.py:本地与EBS环境识别方案
实现Django Settings自动切换(本地 vs EBS环境)
当然可以实现自动化切换!我之前把Django部署到EBS的时候也遇到过一模一样的需求,下面分享几种靠谱的方案,从环境检测到配置切换一步到位:
如何检测当前是本地还是EBS环境?
EBS实例自带几个独特的标识,用来判断环境非常方便:
- 环境变量(最推荐):EBS会自动给实例设置专属环境变量,比如
AWS_EXECUTION_ENV的值固定是elasticbeanstalk,还有EB_ENVIRONMENT_NAME就是你在控制台创建的环境名称。用这个判断最直接,不需要额外权限。 - EC2元数据:可以访问EC2的元数据服务(
http://169.254.169.254/latest/meta-data/)获取实例信息,但这个需要实例有访问权限,不如环境变量省心。
自动化切换Settings的具体实现
方案1:主Settings+环境变量分支导入(最基础实用)
保留一个主settings.py存放通用配置,然后根据环境判断导入local或prod的差异化配置:
# 主settings.py import os from pathlib import Path # ---------------------- 通用配置 ---------------------- BASE_DIR = Path(__file__).resolve().parent.parent INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', # ... 其他所有环境通用的APP和配置 ] MIDDLEWARE = [ # ... 通用中间件 ] # ---------------------- 环境检测与分支导入 ---------------------- # 优先用EBS专属环境变量判断,没有的话默认本地环境 if os.getenv('AWS_EXECUTION_ENV') == 'elasticbeanstalk': # 生产环境导入prod配置 from .prod import * else: # 本地开发导入local配置 from .local import *
然后你的local.py和prod.py只需要写各自的差异配置就行:
# local.py DEBUG = True ALLOWED_HOSTS = ['localhost', '127.0.0.1'] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } }
# prod.py DEBUG = False ALLOWED_HOSTS = ['your-eb-domain.elasticbeanstalk.com'] # EBS通常搭配RDS,直接用环境变量读取数据库凭证 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': os.getenv('RDS_DB_NAME'), 'USER': os.getenv('RDS_USERNAME'), 'PASSWORD': os.getenv('RDS_PASSWORD'), 'HOST': os.getenv('RDS_HOSTNAME'), 'PORT': os.getenv('RDS_PORT'), } }
方案2:用django-environ统一管理(更优雅的进阶方案)
如果你的配置项比较多,推荐用django-environ库来统一加载环境变量或本地.env文件,自动区分环境:
- 先安装库:
pip install django-environ - 主settings.py配置:
import environ from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent env = environ.Env( # 配置默认值和数据类型 DEBUG=(bool, True), DJANGO_ENV=(str, 'local') ) # 本地环境自动加载.env文件 if env('DJANGO_ENV') == 'local': environ.Env.read_env(BASE_DIR / '.env') # ---------------------- 通用配置 ---------------------- INSTALLED_APPS = [ # ... 通用APP ] # ---------------------- 环境相关配置 ---------------------- DEBUG = env('DEBUG') ALLOWED_HOSTS = env.list('ALLOWED_HOSTS') # 直接从环境变量或.env读取数据库配置 DATABASES = { 'default': env.db() }
本地创建.env文件(记得添加到.gitignore):
DEBUG=True ALLOWED_HOSTS=localhost,127.0.0.1 DATABASE_URL=sqlite:///db.sqlite3
EBS那边直接在控制台的「配置」→「软件」里设置环境变量:DEBUG=False、ALLOWED_HOSTS=your-eb-domain.com、DATABASE_URL=postgres://user:pass@rds-host:port/dbname,部署后自动生效生产配置。
额外注意事项
- EBS部署时,确保
wsgi.py/asgi.py里指定的是主settings:os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings') - 本地想临时测试生产配置,只需要在终端运行
export DJANGO_ENV=prod再启动服务即可 - 永远不要把
.env文件或者prod的敏感配置提交到版本控制
内容的提问来源于stack exchange,提问作者user13514973
相关产品推荐
相关产品推荐

