Django官方爲何沒有標準項目結構

Django官方並無提供標準的項目結構,因而網上衆說紛紜,百花齊放,一千個讀者有一千個哈姆雷特。那咱們該怎麼設計項目結構呢?在回答這個問題以前,先了解一下Django原生的目錄和文件都是幹嗎的。css

project

在使用django-admin startproject命令後就會建立這樣的目錄文件,以下:python

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

根目錄mysite/

根目錄的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,不修改其餘位置:

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

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

很是的像那麼回事。我又搜了其餘實踐的文章,找到了這張圖:

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

相關文章
相關標籤/搜索