Django官方並無提供標準的項目結構,因而網上衆說紛紜,百花齊放,一千個讀者有一千個哈姆雷特。那咱們該怎麼設計項目結構呢?在回答這個問題以前,先了解一下Django原生的目錄和文件都是幹嗎的。css
在使用django-admin startproject
命令後就會建立這樣的目錄文件,以下:python
mysite/ manage.py mysite/ __init__.py settings.py urls.py asgi.py wsgi.py
根目錄的mysite/,僅僅是個目錄而已,Django不會拿它作什麼,它的名字能夠隨意修改。shell
帶短橫線的根目錄django
分享一個踩坑經驗,有時候咱們想把項目名命名爲帶短橫線的,如 hello-world,經過命令直接建立會報錯:bootstrap
...\> django-admin startproject hello-world CommandError: 'hello-world' is not a valid project name. Please make sure the name is a valid identifier.
startproject
不支持直接建立帶短橫線的項目名。服務器
方法1 加參數app
其實!它是支持的,只是咱們漏了一個參數。startproject
的完整格式爲django-admin startproject name [directory]
,能夠在後面追加一個目錄參數:ide
...\> django-admin startproject helloworld hello-world
就能夠了。根目錄是hello-world
,裏面的project是helloworld
。函數
方法2 更名字工具
先用helloworld建立,而後再修改,能夠①在資源管理器中直接修改文件夾,②也能夠在 PyCharm 中修改:
選擇Rename directory:
注意去掉勾選Search,不修改其餘位置:
只修改這個根目錄的名字便可。
Django的命令行工具,使用頻繁,格式爲:
python manage.py <command> [options]
Django項目實際使用到的Python包,存放項目配置、URL路由等。
代表這個目錄是Python包。
Django項目配置。
URL路由。
兼容ASGI Web服務器的入口。
兼容WSGI Web服務器的入口。
ASGI和WSGI,都是一種Python的Web服務網關接口協議,是在CGI通用網關接口,Common Gateway Interface)的標準上構建的。
app是Django項目的應用,一個project能夠包含多個app。在使用django-admin startapp
命令後就會建立這樣的目錄文件,以下:
polls/ __init__.py admin.py apps.py migrations/ __init__.py models.py tests.py views.py
app的Python包,能夠放在任意路徑。修改存放路徑,相關配置中的路徑也須要修改。
存放Django自帶後臺管理的models。
app配置信息,例如:
from django.apps import AppConfig class PollsConfig(AppConfig): name = 'polls'
存放路徑不一樣,name的值也不一樣。
Django數據遷移生成的遷移記錄文件。
存放app的models。
單元測試。
視圖函數(類)。
app的路由配置,須要手動添加,可經過include()
函數導入到mysite/urls.py
中,例如:
from django.contrib import admin from django.urls import include, path urlpatterns = [ path('admin/', admin.site.urls), path('polls/', include('polls.urls')), ]
polls/urls.py:
from django.urls import path from . import views urlpatterns = [ path('', views.index), ]
訪問xxx/polls/
就會路由到views.index
。
雖然說是百家爭鳴,但也有公認的工程化實踐。我找了GitHub上star最多的叫作Django Edge的project skeleton,它的設計以下:
Top-directory ├── docs ├── logs ├── README.md ├── requirements │ ├── base.txt │ ├── development.txt │ └── production.txt ├── requirements.txt └── src ├── Your project name │ ├── __init__.py │ ├── logger.py │ ├── settings │ │ ├── base.py │ │ ├── development.py │ │ ├── local.sample.env │ │ └── production.py │ ├── urls.py │ ├── views.py │ └── wsgi.py ├── accounts │ ├── admin.py │ ├── forms.py │ ├── migrations │ ├── models.py │ ├── templates │ ├── tests.py │ ├── urls.py │ └── views.py ├── manage.py ├── media ├── profiles │ ├── admin.py │ ├── apps.py │ ├── forms.py │ ├── migrations │ ├── models.py │ ├── signals.py │ ├── templates │ ├── tests.py │ ├── urls.py │ └── views.py ├── static │ ├── bootstrap │ │ ├── css │ │ ├── fonts │ │ └── js │ └── site │ ├── css │ ├── ico │ ├── img │ └── js └── templates
很是的像那麼回事。我又搜了其餘實踐的文章,找到了這張圖:
國內的文章也有提到相似這2種項目結構的設計,特色是①app放置在單獨目錄統一管理,②requirements和settings按環境作拆分,等等等。我說說個人觀點,一開始沒有必要就按照這種標準的工程化實踐來寫項目,我更傾向於先憑本身的能力寫一版,再不斷重構和優化的方式。業務不一樣,能力不一樣,經驗不一樣,寫出來的代碼天然也不一樣。不過在碰到問題時,能夠參考借鑑,極可能別人已經提供瞭解決方案。
我看了一些Django開源項目代碼,不多見到真像這麼設計項目結構的,因此沒必要過度在乎。
本文介紹了Django startproject和startapp命令產生的目錄文件的結構和做用。而後給出了工程化項目參考。項目結構沒有標準,只有適用於當前的最佳實踐,可能這就是官方沒有給出標準項目結構的緣由吧。
參考資料:
https://docs.djangoproject.com/en/3.1/intro/tutorial01/
https://django-edge.readthedocs.io/en/latest/Architecture/
https://studygyaan.com/django/best-practice-to-structure-django-project-directories-and-files