1.為什麼要拆分

就像本文標題一樣,對Django的配置文件Settings.py進行拆分的主要目的就是為了使線下開發和線上開發配合得更加方便。以我的個人網站(www.eastnotes.com)舉例,在本地進行開發時的一些配置,比如資料庫配置信息,和遠程部署伺服器上的配置是不一樣的。另外,本地開發所單獨需要載入的某些APP(比如django-debug-toolbar),在部署伺服器上就不需要載入。

在拆分之前,我的解決方案是將djangoblog/settings.py文件寫入.gitignore配置文件中,這樣在版本控制的時候,Git就會忽略對這個文件的跟蹤,從而保持本地配置和遠程配置的不一樣。但這樣做的缺點就是,每當我需要更改配置文件的時候,就需要改兩次,非常麻煩。通過對配置文件的拆分,就能大大減輕這種不便,接下來看具體操作。

2.拆分後的效果

├── settings
│ ├── __init__.py
│ ├── base.py
│ ├── local.py
│ └── production.py

我將原始settings.py文件拆分成了3個文件,base.py存放在本地開發和線上部署所共同的配置信息,local.py存放本地開發所特有的資料庫配置等信息,production.py存放線上部署所特有的資料庫配置等信息。__init__.py是一個空文件,作用是使seetings文件夾成為一個包文件。以便使用import語句。

3.拆分步驟

3.1 創建文件

在原始settings.py配置文件的同級項目下創建一個settings文件夾,然後在該文件夾下創建四個.py文件,命名參考上面一段內容。注意,一定要創建一個空的__init__.py文件。否則後期進行導入操作的時候一定會遇到如下的報錯:

ModuleNotFoundError: No module named djangoblog.settings.local; djangoblog.settings is not a package

3.2 內容拆分

內容的拆分需要你從settings.py文件中進行篩選,將線上線下所共同需要的配置放入base.py中,將線下獨有的配置放入到local.py中,將線上所獨有的配置放入production.py中。

3.2 內容導入

要想使local.pyproduction.py都能使用到base.py文件中的配置,我們需要在這兩個文件的頂部寫入import語句:

from .base import *

以上就完成了內容上面的拆分,但僅僅拆分完是不夠的,此時django還不能自動識別並使用這些配置文件,我們還需要接下來的相關配置。

4.相關配置

4.1 修改manage.py

manage.py應該是我們初學django時就會使用到的一個工具文件,使用它我們可以啟動項目,創建APP,創建超級用戶等操作。當我們使用它啟動項目的時候,它會自動載入文件中的一個配置:DJANGO_SETTINGS_MODULE,該配置指定了配置文件的所在位置,由於我們更改了配置文件,因此也一定要更改它才能正常啟動Django,你需要將djangoblog換成你的項目名即可。

os.environ.setdefault(DJANGO_SETTINGS_MODULE, djangoblog.settings.local)

4.2 修改BASE_DIR

base.py文件中有一個配置文件路徑的選項,拆分之前的代碼如下:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

這樣設置的BASE_DIR的值是/Users/reborn/PycharmProjects/djangoblog,也就是說指向的是項目的根目錄,但是拆分之後,該值所指向的是/Users/reborn/PycharmProjects/djangoblog/djangoblog,如果不修改,django會找不到使用了這個路徑的文件,比如模板文件,會報出下面的錯誤:

django.template.exceptions.TemplateDoesNotExist: base.html

因此,我們只需要將此目錄指向上一級目錄就可以了,使用join完成:

BASE_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "..")

4.3 修改wsgi.py

修改這個文件的需求是我在部署時才發現的,在完成上面的步驟之後,我就通過git更新了伺服器上的配置文件,重啟nginxuwsgi之後,網站依然打不開。使用python manage.py runserver之後,項目能正常啟動,但是網站依然打不開。

於是我突然想到應該是uwsgi找不到我的配置文件,因為線上部署的話是通過uwsgi來啟動我們的項目的。打開djangoblog下的wsgi.py文件後,不出我所料,這裡面同樣有一個有關DJANGO_SETTINGS_MODULE的配置,因此我將它指向我的production.py配置文件:

os.environ.setdefault(DJANGO_SETTINGS_MODULE, djangoblog.settings.production)

此時,再打開網站就沒有問題了。

4.4 修改Pycharm

如果你用的是Pycharm進行Django開發的話需要進行此項修改。每次使用Pycharm運行項目的時候,它都會默認載入一個自帶的配置,這個配置在Pycharm運行按鈕的旁邊,下拉菜單中有一個Edit Configurations,點擊之後修改裡面的Environment variables,目的也是讓Pycharm能夠找到我們的本地配置文件:

PYTHONUNBUFFERED=1;DJANGO_SETTINGS_MODULE=djangoblog.settings.local

至此,對Django配置文件的拆分工作已經完成,你可以刪除原來的settings.py文件了。如果你在配置的過程中有任何問題都可以在下方留言,或者關注我的【公眾號:程序員向東】私聊我。等你喲~

推薦閱讀:

相关文章