Django多环境配置实战:利用django-environ动态加载.env文件及Crontab适配

白榆
白榆
发布时间:2026-10-13 | 4人浏览过
原创

本文详解在Django项目中通过django-environ库实现多环境配置管理的方案。重点介绍如何创建并加载不同环境的.env文件(如local、product),通过PROJECT_ENV环境变量动态切换配置。同时提供Django Crontab定时任务在多环境下的配置技巧,确保定时脚本能正确读取对应环境的参数,提升部署效率与安全性。

Django多环境配置概述

概述

本文主要梳理在Django项目中解决不同运行环境下加载不同.env环境配置文件的方法。核心内容涵盖django-environ库的安装与基础使用,以及针对django-crontab脚本环境下的特殊配置方案。

django-environ库安装与基础使用

django-environ库的应用

安装步骤

参考django-environ官方GitHub仓库获取最新信息。


pip install django-environ

基本用法

创建.env文件


# 项目目录中
touch .env

# 增加环境变量
DEBUG=True
SECRET_KEY=your-secret-key
DATABASE_URL=psql://urser:un-githubbedpassword@127.0.0.1:8458/database
SQLITE_URL=sqlite:///my-local-sqlite.db
CACHE_URL=memcache://127.0.0.1:11211,127.0.0.1:11212,127.0.0.1:11213
REDIS_URL=rediscache://127.0.0.1:6379/1?client_class=django_redis.client.DefaultClient&password=ungithubbed-secret

将.env文件与settings.py配合使用。为便于内网开发,目前采用GitLab作为代码托管平台,因此无需将.env文件加入.gitignore忽略列表,直接提交至仓库即可实现配置文件的版本控制与共享。


import environ

# initialize env
env = environ.Env(
 # set casting, default value
 DEBUG=(bool, False)
)
# reading .env file
environ.Env.read_env()

# False if not in os.environ
DEBUG = env('DEBUG')

# Raises django's ImproperlyConfigured exception if SECRET_KEY not in os.environ
SECRET_KEY = env('SECRET_KEY')

# Parse database connection url strings like psql://user:pass@127.0.0.1:8458/db
DATABASES = {
 # read os.environ['DATABASE_URL'] and raises ImproperlyConfigured exception if not found
 'default': env.db(),
 # read os.environ['SQLITE_URL']
 'extra': env.db('SQLITE_URL', default='sqlite:////tmp/my-tmp-sqlite.db')
}

CACHES = {
 # read os.environ['CACHE_URL'] and raises ImproperlyConfigured exception if not found
 'default': env.cache(),
 # read os.environ['REDIS_URL']
 'redis': env.cache('REDIS_URL')
}

动态加载不同环境.env文件

实现多环境配置切换

在仅使用单一settings.py文件的前提下,可通过定义一个特定的环境变量来读取不同环境的.env文件,从而区分运行环境。该特定环境变量不能直接写入.env文件中,必须通过外部方式手动指定。假设将该环境变量命名为PROJECT_ENV,则在命令行执行任何Django命令时,需在命令前添加PROJECT_ENV=xxx以指定具体环境。此外,也可通过export命令、修改shell配置文件,或在supervisord及uwsgi配置文件中指定该环境变量。

执行方式示例


PROJECT_ENV=local python manage.py runserver

多环境.env文件结构设计

假设当前存在local(本地)和product(生产)两种环境,需在项目目录下的envs文件夹中分别新建.env.local和.env.product文件。

settings.py代码适配


import os
import environ
import logging.config

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

env = environ.Env(
 # set casting, default value
 DEBUG=(bool, False)
)

"""
通过指定环境遍历加载不同env文件
PROJECT_ENV=production python manage.py crontab add
默认场景下可不指定,则加载local文件
"""
env_name = env.str('PROJECT_ENV', 'local')
# reading .env file
env.read_env('envs/.env.%s' % env_name)

Django Crontab多环境配置适配

Django Crontab脚本环境下的配置加载

关于django-crontab的具体使用,可参考《Django实现服务端定时任务》一文。

代码调整方案

在settings.py文件中,针对django-crontab的任务配置CRONJOBS,需增加CRONTAB_COMMAND_PREFIX参数。


'PROJECT_ENV=' + env_name 参数指定

CRONJOBS = [
 ("*/5 * * * *", "analysis.cron.test_cron", ">>" + LOG_DIR + "log/fba_claim_shipment.log"),
]

CRONTAB_COMMAND_PREFIX = 'PROJECT_ENV=' + env_name

Crontab执行方式


PROJECT_ENV=local python manage.py crontab add

以上内容为本文全部要点,希望对各位的学习有所帮助,欢迎继续支持本站获取更多技术分享。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表