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

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

本文详解在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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。