简述
本文主要是整理如何在 django 项目中解决不同环境下加载不同 .env 环境配置文件的方案。主要内容包含 django-environ 的安装使用,以及 django-crontab 脚本环境下的配置使用。
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
与 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') }
如何实现不同环境下加载不同环境变量
在只使用一个 settings.py 文件情况下,可以只使用一个环境变量,通过此环境变量来读取不同环境的 .env 文件以区分不同环境。 这个环境变量就没法写在 .env 文件了,必须手动指定。假设我们这个环境变量叫PROJECT_ENV。那么我们在命令行执行任何命令的时候,在前面加上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实现服务端的定时任务
代码调整
在 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
执行方法
PROJECT_ENV=local python manage.py crontab add
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍利用Django-environ如何区分不同环境,包括了利用Django-environ如何区分不同环境的使用技巧和注意事项,需要的朋友参考一下 介绍 Django是一个Web框架——一套用于帮助开发交互式网站的工具。Django能够响应网页请求,还能让我们更轻松地读写数据库、管理用户等。本文主要介绍了关于利用Django-environ区分不同环境的相关内容,下面话不多说了,来一起
我目前正在制作一个Minecraft Mod Loader。 正如您在上面看到的,我有一个名为Client的类。当Minecraft游戏启动时,启动被调用。现在我有一个名为Mods的文件夹,在调用startup时,我需要将Mods从Mods文件夹加载到ArrayList命名模块中。更深入地说,每个Mod将有一个继承这个模块类的主类 因此,在调用startup时,我需要遍历mods文件夹中的每个Mo
HDFS设置: 未设置。 不返回任何内容。 我试图避免自己在加载后不得不在应用程序中重新分区。 是否有一种方法可以强制Spark用存储在HDFS上的相同数量的分区加载parquet文件?
我需要加载不同服务器上存在的类文件,并在类文件中执行方法。我不想使用超文本传输协议或RMI,但想应用这种方法。我正在看URLClassLoader,但没有得到任何地方。有人能给我一个从不同服务器加载类的例子吗?
问题内容: 这就是我自动加载文件夹中所有类的方式, 但是我的文件夹中也有类,我也想自动加载它们-我该怎么办?我应该复制上面的自动加载并仅将路径更改为(但是不是重复吗?)? 谢谢。 编辑: 这些是我在控制器文件夹中的类文件名: 这些是我在模型文件夹中的类文件名: 通常这就是我命名控制器类类的方式(我使用下划线和小写), 这通常是我为模型类类命名的方式(我使用下划线和小写), 问题答案: 您应该命名您
我正在使用OWL API加载不同的文件并合并为一个进行推理。我有一个描述本体的文件和几个与个人的文件。当我打印它显示的公理时,每个个体都有foaf属性,例如,foaf:title “AnnotationAssertion(http://xmlns.com/foaf/0.1/title...” 多谢了。