(2)Django生产环境数据库的切换以及环境配置python-dotenv方案

简介

本文分享下个人目前在用的,DRF项目开发环境、生产环境数据库切换的方案。没做过什么大项目,可能实现的不是那么优雅。

主要思路就是通过python-dotenv库,编辑.env环境配置文件区分开发环境和生产环境,再使用数据库路由,部署在生产环境的项目将自动连接生产环境数据库。

环境配置区分实现流程(python-dotenv)

1.安装python-dotenv

shell 复制代码
pip install python-dotenv # 有手就行

2.在项目根目录 下创建.env文件

3.在.env文件内添加自己准备区分的配置,比如DEBUG,或者各种第三方开发平台的key,以及各种生产环境,开发环境需要区分的配置项

python 复制代码
# dotenv会以键值对的形式读取配置,配置项用=分割
DJANGO_DEBUG=True
WEATHER_KEY=***********
......

4.在你项目的git忽略文件.gitignore中添加.env文件,因为我们生产环境和开发环境需要不同的配置,所以这个文件不能同步

5.演示引用配置,比如我们常用的,在settings.py中调取.env中的debug 配置来区别开发/生产环境

settings.py

python 复制代码
from dotenv import load_dotenv
# .ENV配置读取
load_dotenv()
# 读取DEBUG状态
DEBUG = os.getenv('DJANGO_DEBUG') in ['True', 'true', '1', 'yes', 'y']  

# 也可以读取一些KEY
# 和风天气KEY
WEATHER_KEY = os.getenv('WEATHER_KEY')

配置完成

简单几步就配置完成了,环境配置管理还是非常简单好用的,要注意的是首次使用dotenv后别忘了生产环境也要安装上python-dotenv

数据库区分

上面讲到了在settings.py中获取env配置,那么最简单的办法就根据env中的Debug配置,写个if判断就好

python 复制代码
DATABASES = {
    'default': {
        # 开发环境数据库
     		'ENGINE': 'django.db.backends.mysql',
        'NAME': '****-dev',
        'USER': '****',
        'PASSWORD': '****',
        'HOST': '******',
        'PORT': '***'
    } if DEBUG else {
        # 生产环境
     		'ENGINE': 'django.db.backends.mysql',
        'NAME': '****-prod',
        'USER': '****',
        'PASSWORD': '****',
        'HOST': '******',
        'PORT': '***'
    },
}

数据库路由实现

实际上大部分情况都用不上数据库路由,如果只是根据环境区分数据库,只需要settings.py中加个if判断就好了。下面的内容看看就好,搞不好哪天用到了呢

settings.py

python 复制代码
DATABASES = {
    # 开发环境数据库
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '****-dev',
        'USER': '****',
        'PASSWORD': '****',
        'HOST': '******',
        'PORT': '***'
    },
    # 生产环境数据库
    'prodDB': {
     		'ENGINE': 'django.db.backends.mysql',
        'NAME': '****-prod',
        'USER': '****',
        'PASSWORD': '****',
        'HOST': '******',
        'PORT': '***'
    },
}
# 注册数据库路由
DATABASE_ROUTERS = ['database_routers.DatabaseRouter']

在项目根目录创建database_routers.py

python 复制代码
from django.conf import settings
"""
这里能实现很多,目前只是实现了区分生产/开发数据库这个最简单的功能
"""
class DatabaseRouter:
    def db_for_read(self, model, **hints):
        if settings.DEBUG:
            return 'default'
        return 'prodDB'

    def db_for_write(self, model, **hints):
        if settings.DEBUG:
            return 'default'
        return 'prodDB'

    def allow_relation(self, obj1, obj2, **hints):
        return True

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        return True

本人源站原文链接点这里

相关推荐
gma99920 分钟前
Etcd 框架
数据库·etcd
好看资源平台22 分钟前
网络爬虫——综合实战项目:多平台房源信息采集与分析系统
爬虫·python
爱吃青椒不爱吃西红柿‍️22 分钟前
华为ASP与CSP是什么?
服务器·前端·数据库
陈王卜29 分钟前
django+boostrap实现发布博客权限控制
java·前端·django
进击的六角龙43 分钟前
深入浅出:使用Python调用API实现智能天气预报
开发语言·python
檀越剑指大厂44 分钟前
【Python系列】浅析 Python 中的字典更新与应用场景
开发语言·python
湫ccc1 小时前
Python简介以及解释器安装(保姆级教学)
开发语言·python
孤独且没人爱的纸鹤1 小时前
【深度学习】:从人工神经网络的基础原理到循环神经网络的先进技术,跨越智能算法的关键发展阶段及其未来趋势,探索技术进步与应用挑战
人工智能·python·深度学习·机器学习·ai
羊小猪~~1 小时前
tensorflow案例7--数据增强与测试集, 训练集, 验证集的构建
人工智能·python·深度学习·机器学习·cnn·tensorflow·neo4j
Yz98761 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发