在使用 Django
开发项目的过程当中老是会遇到生产环境和开发环境须要使用不一样设置文件的状况,以前我都是在开发环境作完开发在后上传到服务器而后在服务器上修改设置文件,一来二去的就以为很麻烦,恰巧昨天看到了这样一篇文章 Django 工程结构以及利用 Git 分支进行生产环境切换 里面描述了一种用利用 Git
分支在不一样环境下切换设置文件的方法,可是说实话我没明白他这样作的意义,难道要为不一样的环境建立不一样的 Git
分支吗?多是我 Git
学的不深不是很能理解,可是这篇文章仍是给我提供了很好的思路。而后我又经过 Google
看到了另外一篇文章 Django 开发环境与生产环境的区分,结合这两篇文章我自定义了下面的方案。html
拆分设置文件,在不一样环境下设置不一样的环境变量而后经过 Python
的 os.environ.get
方法获取当前环境的环境变量,根据不一样的环境变量 import
不一样的设置文件,具体以下:python
在 Django
的 project
目录下新建 settings
目录,而后根据本身的需求在 settings
目录下建立诸如 base.py, dev.py, pro.py, test.py
之类的设置文件,个人需求比较简单只分了 base.py, dev.py, pro.py
三个文件,它们分别表示:基础设置,开发环境设置和生产环境设置。shell
通常状况下都是以 base.py
为拆分后的设置文件入口django
...
# 根据环境变量导入不一样设置文件
# 若是环境变量中存在 ENV(具体值可行自定义)则断定为生产环境导入生产环境设置
# 不然则断定为开发环境导入开发环境设置
if os.environ.get('ENV', None):
from .pro import *
else:
from .dev import *
...
复制代码
拆分完设置文件后须要修改那些引用了设置文件的文件:wsgi.py, manage.py
vim
# wsgi.py
# 修改此文件以确保经过 uwsgi 启动时程序可以正确的找到设置文件
import os
from django.core.wsgi import get_wsgi_application
# 这一行是重点,意思是添加环境变量 DJANGO_SETTINGS_MODULE 为 backend.settings.bases
# 具体值应根据我的项目的设置文件入口路径自行设置
os.environ['DJANGO_SETTINGS_MODULE'] = 'backend.settings.base'
application = get_wsgi_application()
复制代码
# manage.py
# 修改此文件以确保经过 python manage.py runserver 启动时程序可以正确的找到设置文件
#!/usr/bin/env python
import os
import sys
if __name__ == '__main__':
# 这一行是重点,意思是添加环境变量 DJANGO_SETTINGS_MODULE 为 backend.settings.bases
# 具体值应根据我的项目的设置文件入口路径自行设置
os.environ['DJANGO_SETTINGS_MODULE'] = 'backend.settings.base'
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
复制代码
最后只须要在生产环境设置与入口文件匹配的环境变量便可:服务器
# vim /etc/profile
# 在最后一行添加:
export ENV="SERVER"
# 随便设置什么值都行可是必须与入口文件匹配
复制代码
作完以上配置之后就能够开始使用了,开发生产两套配置,不须要再上传后另外修改文件了。app
经过方案可以看出整个过程的两个核心点是:spa
Python
区分不一样环境的点只要能完成以上两点就能自定义属于本身的方案。code