在使用 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