Django官方為什麼沒有標準專案結構

dongfanger發表於2020-12-09

Django官方並沒有提供標準的專案結構,於是網上眾說紛紜,百花齊放,一千個讀者有一千個哈姆雷特。那我們該怎麼設計專案結構呢?在回答這個問題之前,先了解一下Django原生的目錄和檔案都是幹嘛的。

project

在使用django-admin startproject命令後就會建立這樣的目錄檔案,如下:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

根目錄mysite/

根目錄的mysite/,僅僅是個目錄而已,Django不會拿它做什麼,它的名字可以隨意修改。

帶短橫線的根目錄

分享一個踩坑經驗,有時候我們想把專案名命名為帶短橫線的,如 hello-world,通過命令直接建立會報錯:

...\> 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 加引數

其實!它是支援的,只是我們漏了一個引數。startproject的完整格式為django-admin startproject name [directory],可以在後面追加一個目錄引數:

...\> django-admin startproject helloworld hello-world

就可以了。根目錄是hello-world,裡面的project是helloworld

方法2 改名字

先用helloworld建立,然後再修改,可以①在資源管理器中直接修改資料夾,②也可以在 PyCharm 中修改:

Django官方為什麼沒有標準專案結構

選擇Rename directory:

Django官方為什麼沒有標準專案結構

注意去掉勾選Search,不修改其他位置:

Django官方為什麼沒有標準專案結構

只修改這個根目錄的名字即可。

manage.py

Django的命令列工具,使用頻繁,格式為:

python manage.py <command> [options]

內部mysite.py/

Django專案實際使用到的Python包,存放專案配置、URL路由等。

mysite/__init__.py

表明這個目錄是Python包。

mysite/settings.py

Django專案配置。

mysite/urls.py

URL路由。

mysite/asgi.py

相容ASGI Web伺服器的入口。

mysite/wsgi.py

相容WSGI Web伺服器的入口。

ASGI和WSGI,都是一種Python的Web服務閘道器介面協議,是在CGI通用閘道器介面,Common Gateway Interface)的標準上構建的。

app

app是Django專案的應用,一個project可以包含多個app。在使用django-admin startapp命令後就會建立這樣的目錄檔案,如下:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

polls/

app的Python包,可以放在任意路徑。修改存放路徑,相關配置中的路徑也需要修改。

admin.py

存放Django自帶後臺管理的models。

apps.py

app配置資訊,例如:

from django.apps import AppConfig


class PollsConfig(AppConfig):
    name = 'polls'

存放路徑不同,name的值也不同。

migrations/

Django資料遷移生成的遷移記錄檔案。

models.py

存放app的models。

tests.py

單元測試。

views.py

檢視函式(類)。

urls.py

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

非常的像那麼回事。我又搜了其他實踐的文章,找到了這張圖:

Django官方為什麼沒有標準專案結構

國內的文章也有提到類似這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

相關文章