Django区分生产环境和开发环境
前言
Django项目上线我会使用Jenkins+docker自动化部署,需要更改settings.py中的mysql和redis配置用于docker部署。所以必须区分生产和开发这两种环境
注意 如果你想省事,直接在git仓库创建两个分支
- master分支是开发环境
- devop分支是生产环境用于自动化部署
1. 简单了解两种环境
- 开发环境 我们平时自己写代码搭建的环境,此时项目在开发阶段,并未上线
- 生产环境 项目上线,需要部署到Linux服务器上
2. 为什么要区分
(1)生产环境的配置与开发环境的配置需要隔离开,开发环境DEBUG=True,生产环境为False
(2)生产环境和开发环境使用的配置不一样,例如分别使用MySQL/Sqlite数据库
示例:
# 开发环境中的数据库配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# 生产环境中的数据库配置(使用docker)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'lishui_gdxt',
'USER': 'username',
'PASSWORD': 'password',
# host为db,是因为docker-compose.yml文件中的服务名为db,docker会自动把db解析成具体地址
'HOST': 'db',
'PORT': '3306',
}
}
3.区分两种环境
将原来项目中的setting.py变成settings文件夹底下的base.py
settings文件夹具体分为
base.py基础配置,开发环境和生产环境相同的配置prod.py生产环境配置dev.py开发环境配置
以prod.py为例,先从base.py中把配置导入进来,之后可以覆盖base中定义的那些配置
from .base import *
DEBUG = False
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'lishui_gdxt',
'USER': 'username',
'PASSWORD': 'password',
# host为db,是因为docker-compose.yml文件中的服务名为db,docker会自动把db解析成具体地址
'HOST': 'db',
'PORT': '3306',
}
}
4.启动Django
方法一:
更改pycharm中的运行配置,更改DJANGO_SETTINGS_MODULE的模块名为你定义的settings文件名,例如
gdxt.settings.prod
方法二: 使用终端启动,在python manage.py runserver 命令后添加参数settings
python manage.py runserver 192.168.100.7:8085 --settings=gdxt.settings.prod
如果不加settings参数,django会使用你在manage.py中默认定义的gdxt.settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'gdxt.settings')
5.settings文件的正确引用
如果想用settings.py里面的变量,直接导入django.conf.settings这个对象。它会找DJANGO_SETTINGS_MODULE对应的模块。
from django.conf import settings
print(setting.DEBUG) # 如果--settings=gdxt.settings.prod,那么结果是False
本地开发时,要在pycharm设置中的语言和框架配置好settings,避免使用settings模块时,pycharm没有代码提示
踩坑提示
python manage.py collectstatic 报错 Unknown command: 'collectstatic'
这是因为如果settings分文件,就找不到django.contrib.staticfiles'这个app
所以正确写法是 python manage.py collectstatic --settings=config.settings.baseord