Django 項(xiàng)目布局方法(值得推薦)
一、這種布局的優(yōu)點(diǎn)
- 項(xiàng)目中的每個(gè)應(yīng)用都相對(duì)獨(dú)立,方便以后拿出來(lái)重用。
- 這樣的布局會(huì)促使你在開發(fā)過(guò)程中考慮每個(gè)應(yīng)用的重用性。
- 開發(fā)、測(cè)試、生產(chǎn)等不同的環(huán)境都有各自獨(dú)立的配置文件,方便配置項(xiàng)的共享和定制。
- 不同的環(huán)境都有各自獨(dú)立的 pip requirements 文件。
- 每個(gè)應(yīng)用都有各自的 templates 和 static 目錄,你可以通過(guò)項(xiàng)目級(jí)的 templates 和 static 目錄中的文件對(duì)各應(yīng)用中的相應(yīng)內(nèi)容進(jìn)行覆蓋。
- 對(duì) models、views、managers 等的測(cè)試都各自保存在獨(dú)立的文件中,易于閱讀和理解。
二、Django 默認(rèn)產(chǎn)生的布局
假設(shè)項(xiàng)目名為 foo, 使用 python django-admin.py startproject foo 命令產(chǎn)生的默認(rèn)布局會(huì)是:
foo/
manage.py
foo/
__init__.py
settings.py
urls.py
wsgi.py
三、推薦的項(xiàng)目布局
假設(shè)我們的項(xiàng)目名為 myproject, 其中有兩個(gè)應(yīng)用 blog 和 users,推薦的項(xiàng)目布局可以為:
myproject/
manage.py
myproject/
__init__.py
urls.py
wsgi.py
settings/
__init__.py
base.py
dev.py
prod.py
blog/
__init__.py
models.py
managers.py
views.py
urls.py
templates/
blog/
base.html
list.html
detail.html
static/
css/
js/
…
tests/
__init__.py
test_models.py
test_managers.py
test_views.py
users/
__init__.py
models.py
views.py
urls.py
templates/
users/
base.html
list.html
detail.html
static/
css/
js/
…
tests/
__init__.py
test_models.py
test_views.py
static/
css/
js/
…
templates/
base.html
index.html
requirements/
base.txt
dev.txt
test.txt
prod.txt
1. 每個(gè)應(yīng)用的目錄位置
最頂層的 myproject 目錄包含有 manage.py 文件,因此是項(xiàng)目的根目錄。 myproject/myproject/ 是項(xiàng)目的內(nèi)容目錄,項(xiàng)目的根 URL 配置文件, WSGI 配置文件都存放在這里面。
myproject/blog/ 和 myproject/users/ 是項(xiàng)目的兩個(gè)應(yīng)用所在的目錄,將 blog、 users 這兩個(gè)應(yīng)用的目錄與 myproject/myproject/ 平行放置,而不放置在 myproject/myproject/ 目錄內(nèi)的好處是: 之后要 import 應(yīng)用中的模塊時(shí),比如 import blog 應(yīng)用中的 models 時(shí),可以用 import blog.models,而不需要用 import myproject.blog.models,這樣也方便之后能將應(yīng)用獨(dú)立出來(lái)重用。
2. 為每個(gè)環(huán)境設(shè)置各自的配置信息
針對(duì)項(xiàng)目的各個(gè)環(huán)境,如本地開發(fā) dev、 內(nèi)部測(cè)試 stage、 自動(dòng)化流程環(huán)境 jenkins 及生產(chǎn)環(huán)境 prod,分別創(chuàng)建獨(dú)立的配置文件。
- 在 myproject/myproject 目錄下新建一個(gè) settings 目錄并在里面創(chuàng)建一個(gè)空的 __init__.py。
- 將 myproject/myproject/settings.py 文件搬到 myproject/myproject/settings/ 目錄下,并改名為 base.py,這個(gè)文件里面的配置信息被所有其它環(huán)境的配置文件所共享。
- 在 myproject/myproject/settings/ 目錄下分別創(chuàng)建 dev.py、stage.py、jenkins.py 和 prod.py 4 個(gè)文件,每個(gè)文件中包含如下的一行代碼:
from base import *
這樣,這些環(huán)境配置文件就能讀取默認(rèn)的配置項(xiàng)了,之后就能在各自的配置文件中設(shè)置定制的配置值了。比如本地開發(fā)環(huán)境,可以在 dev.py 中添加 DEBUG=True**, 而生產(chǎn)環(huán)境 **prod.py**,可以設(shè)置 DEBUG=False`。
指定使用哪個(gè)配置文件:
可以通過(guò)操作系統(tǒng)的環(huán)境變量指定,比如:
export DJANGO_SETTINGS_MODELS="myproject.settings.prod"
也可以通過(guò)命令行參數(shù)指定, 比如:
./manage.py migrate --settings=myproject.settings.prod
或者
gunicorn -w 4 -b 127.0.0.1:8001 --settings=myproject.settings.prod
3. 修改 INSTALLED_APPS
默認(rèn)的 INSTALLED_APPS 會(huì)是:
INSTALLED_APPS = ( ... )
可以將元組 () 改為列表 []:
INSTALLED_APPS = [ ... ]
進(jìn)一步可以將 INSTALLED_APPS 中的第三方(內(nèi)置)的應(yīng)用與我們自己的應(yīng)用分開,如:
PREREQ_APPS = [ ‘django.contrib.auth', ‘django.contrib.contenttypes', … ‘debug_toolbar', ‘imagekit', ‘haystack', ] PROJECT_APPS = [ ‘homepage', ‘users', ‘blog', ] INSTALLED_APPS = PREREQ_APPS + PROJECT_APPS
這樣分開后,我們就可以只針對(duì)我們自己的應(yīng)用進(jìn)行 test 和 code coverage。
以上針對(duì) INSTALLED_APPS 的修改也可以針對(duì) TEMPLATE_DIRS 和 MIDDLEMARE_CLASSES 進(jìn)行。
4. 調(diào)整 pip requirements
項(xiàng)目一般都有一個(gè) requirements.txt 文件,可以指定項(xiàng)目的依賴包,根據(jù)這個(gè)文件,可以用以下命令對(duì)依賴包進(jìn)行自動(dòng)安裝:
pip install -r requirements.txt
在 requirements.txt 文件中可以用 -r filename 來(lái)包含進(jìn)另一個(gè)文件的內(nèi)容,這個(gè)功能和 C 語(yǔ)言中的 #include <filename.h> 類似。
因此,我們可以將通用的依賴信息保存在 myproject/requirements/base.txt 文件中,而針對(duì)不同的環(huán)境,比如測(cè)試環(huán)境,保存在另一個(gè)文件中,如 myproject/requirements/test.txt, 里面的內(nèi)容可能會(huì)是:
-r base.txt pytest==2.5.2 coverage==3.7.1
5. 分割測(cè)試文件
在每個(gè)應(yīng)用中分別創(chuàng)建一個(gè)包含測(cè)試內(nèi)容的目錄 tests,將對(duì)應(yīng)不同類別的測(cè)試分別保存在不同的文件中,如 test_models.py、 test_views.py 等。這樣分配,比起將全部測(cè)試代碼放在單個(gè)文件中的好處是:代碼更易閱讀,同時(shí)還能減少在編輯器中上下翻滾的時(shí)間。
6. URL 配置文件
先各個(gè)應(yīng)用內(nèi)的 urls.py 保存各自的 URL 配置,然后在項(xiàng)目的根 URL 配置文件中,通過(guò) include 命令將子應(yīng)用的 URL 配置信息包含進(jìn)行:
urlpatterns = patterns(‘', url(r'^$', HomePageView.as_view(), name=‘home'), url(r'^blog/‘, include(‘blog.urls')), url(r'^user/‘, include(‘users.urls')), )
7. 模板和靜態(tài)文件
各個(gè)子應(yīng)用都應(yīng)該有各自的模板和靜態(tài)文件目錄,如 blog 的模板和靜態(tài)文件目錄位置應(yīng)該為: myproject/blog/templates/blog/ 和 myproject/blog/static/blog/ 。如果想對(duì)子應(yīng)用中的模板和靜態(tài)文件進(jìn)行覆蓋,可以通過(guò)在項(xiàng)目根模板和根靜態(tài)文件目錄中創(chuàng)建相同名字的文件進(jìn)行。比如要覆蓋 blog 中的 detail.html 模板,可以通過(guò)創(chuàng)建 myproject/templates/blog/detail.html 文件來(lái)對(duì)默認(rèn)的模板文件進(jìn)行覆蓋。
8. 重用子應(yīng)用
如果想在另一個(gè)項(xiàng)目中重用 blog 應(yīng)用,正確的方法是:
- 將 blog 應(yīng)用提取出來(lái),創(chuàng)建一個(gè)獨(dú)立的代碼庫(kù)
- 在各個(gè)項(xiàng)目中,使用 pip install 的方式安裝 blog 應(yīng)用
- 在各個(gè)項(xiàng)目中,使用 pip 對(duì)依賴的 blog 進(jìn)行更新
參考文獻(xiàn): http://www.revsys.com/blog/2014/nov/21/recommended-django-project-layout/
到此這篇關(guān)于Django 項(xiàng)目布局方法(值得推薦)的文章就介紹到這了,更多相關(guān)Django 項(xiàng)目布局方法(值得推薦)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python pandas 解析(讀取、寫入)CSV 文件的操作方法
這篇文章主要介紹了python pandas 解析(讀取、寫入) CSV 文件,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12
Windows上使用Python增加或刪除權(quán)限的方法
下面小編就為大家分享一篇Windows上使用Python增加或刪除權(quán)限的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
python實(shí)現(xiàn)將excel文件轉(zhuǎn)化成CSV格式
下面小編就為大家分享一篇python實(shí)現(xiàn)將excel文件轉(zhuǎn)化成CSV格式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
python使用QQ郵箱實(shí)現(xiàn)自動(dòng)發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了python使用QQ郵箱實(shí)現(xiàn)自動(dòng)發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
Python 序列化和反序列化庫(kù) MarshMallow 的用法實(shí)例代碼
marshmallow(Object serialization and deserialization, lightweight and fluffy.)用于對(duì)對(duì)象進(jìn)行序列化和反序列化,并同步進(jìn)行數(shù)據(jù)驗(yàn)證。這篇文章主要介紹了Python 序列化和反序列化庫(kù) MarshMallow 的用法實(shí)例代碼,需要的朋友可以參考下2020-02-02
python實(shí)現(xiàn)跨年表白神器--你值得擁有
這篇文章主要介紹了python實(shí)現(xiàn)跨年表白神器的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-01-01
PyQt通過(guò)動(dòng)畫實(shí)現(xiàn)平滑滾動(dòng)的QScrollArea
這篇文章主要為大家詳細(xì)介紹了PyQt如何使用Qt的動(dòng)畫框架 QPropertyAnimation來(lái)實(shí)現(xiàn)平滑滾動(dòng)的QScrollArea,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的可以學(xué)習(xí)一下2023-01-01
Python 利用pandas和mysql-connector獲取Excel數(shù)據(jù)寫入到MySQL數(shù)據(jù)庫(kù)
在實(shí)際應(yīng)用中,我們可能需要將Excel表格中的數(shù)據(jù)導(dǎo)入到MySQL數(shù)據(jù)庫(kù)中,以便于進(jìn)行進(jìn)一步的數(shù)據(jù)分析和處理,本文將介紹如何使用Python將Excel表格中的數(shù)據(jù)插入到MySQL數(shù)據(jù)庫(kù)中,需要的朋友可以參考下2023-10-10

