Django官方為什麼沒有標準項目結構

2020-12-11 紙鶴視界

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-worldCommandError: '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 中修改:

選擇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.pypolls/

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

admin.py

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

apps.py

app配置信息,例如:

from django.apps import AppConfigclass 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 adminfrom django.urls import include, pathurlpatterns = [ path('admin/', admin.site.urls), path('polls/', include('polls.urls')),]polls/urls.py:

from django.urls import pathfrom . import viewsurlpatterns = [ 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

相關焦點

  • Django 官方推薦的姿勢:類視圖
    為什麼需要將類視圖轉換成函數視圖呢?我們來看一看 blog 的 URL 配置:blog/urls.pyapp_name = 'blog'urlpatterns = [ path('', views.index, name='index'), ...]
  • 如何使用Visual Studio創建Django項目
    ,還可以新建django框架項目。選擇Django Web項目3、配置新項目,輸入項目名稱,選擇項目位置,點擊創建配置新項目,輸入項目名稱,選擇項目位4、創建完Django框架項目,查看項目結構創建完Django框架項目,查看項目結構5、點擊工具上方的啟動,運行python項目
  • Django 2.0 項目實戰: 擴展Django自帶User模型,實現用戶註冊與登錄
    INSTALLED_APPS = [    'reg.apps.RegConfig',    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages
  • django 自帶 user 欄位擴展及頭像上傳
    會同時生成 user 表和 user_profile 表這個方法雖然是官方推薦的,但是個人還是覺得很麻煩,獲取 profile 的欄位值還需要通過 user 表的外鍵獲取 profile 實例,然後再獲取欄位值,再考慮到 django 的通過外鍵生成反向欄位也需要做些處理,如果說我們只需要額外添加一個欄位,需要做那麼多工作,我是拒絕的。
  • 一個完整的Django入門指南
    如果你的Mac還沒有安裝Homebrew的話,在終端中執行下面的命令:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"如果你沒有安裝命令行工具(Command Line Tools),Homebrew
  • Django第二十八課
    1.5 將自定義模型加入admin打開後臺,發現我們定義的user並沒有加入後臺。添加暱稱:我們看到後臺還沒有顯示暱稱欄位,這時我們參照UserAdmin修改fieldsets,我們可以傳入我們自己定義的nickname欄位,同時在user
  • python程式設計師嘔心瀝血整理 Django 優秀資源大全
    django-compat, star:91 - 為官方支持的 Django 版本提供向前和向後兼容層。django-compat-lint, star:36 - 為你的代理檢查 Django 兼容性(2 年未更新)。儀錶盤用於創建信息儀錶盤以可視化數據的包。
  • Django分頁完整示例
    在django中可以使用兩種方法進行分頁,第一種方法是使用基於函數的視圖,第二種方法是使用基於類的視圖。現在,首先,需要使用此命令創建一個新的django項目。我稱這個項目為MyProjectdjango-admin startproject ProjectName首先,需要將目錄更改為已創建的項目,然後需要創建一個App,我將其稱為MyApp。
  • Python+django網頁設計入門(12):使用Bootstrap和jQuery
    前導課程:Python+django網頁設計入門(11):在線考試與自動評分Python+django網頁設計入門(10):分頁顯示Python+django網頁設計入門(9):自定義反爬蟲功能Python+django網頁設計入門(8):網站項目文件夾布局Python+django網頁設計入門
  • Python基礎教程——秒懂django操作資料庫
    django大法上吧複雜的操作,我們是一定要用django的,因為它真的很靈活,而且還有連接池。使用django操作資料庫的核心步驟是定義好Model,也就是數據模型,定義好之後,使用項目的manage.py這個項目管理工具將模型自動創建成數據表,就可以開始了。很簡單,再複雜的業務操作,都可以簡化成增、刪、改、查四種操作:
  • 8個能提高Django開發效率的Python包
    這裡介紹了六個Django應用程式包和兩個Django的REST框架包,當我們說這些包幾乎出現在我們工作的每個項目中時,一點也沒有誇張。但是在此之前,你可以先看看我們之前寫的有關如何讓Django 管理更加安全的技巧,以及一篇關於5個最喜歡的開源Django包的文章。
  • Python——用 Django 寫 restful api 接口
    Django 目錄結構urls.py (https://code.ziqiangxuetang.com/django/django-views-urls.html)—— 網址入口,關聯到對應的 views.py 中的一個函數(或者 generic 類),訪問網址就對應一個函數。
  • Django實現分頁功能
    在本節中,我們將介紹 Django 為我們提供的高級模塊,通過高級模塊的學習,你會感受到 Django 的易用性如此之強,但是同時它又很複雜,所以在學習 Django 這樣的重度框架的時候,我們一定要切記急躁,對於新的知識要敢於探索,除了要跟隨著本教程的進度學習之外,大家也要拿出時間多閱讀 Django 源碼、官方文檔
  • Django官方文檔終於出中文版了
    昨天經 Sur 同學告知才發現,Django 官方文檔居然支持中文了!
  • Python Django之路與您同行
    終端Terminal中輸入sudo pip install django,等待安裝完成,如圖:使用命令python -m django --version或者pip show django查看django版本信息,如圖:
  • django-admin和manage.py用法
    記錄要點:django-admin和manage.py 能做同樣的事情 像我們常用的python manage.py runserver,用django-admin也可以操作:django-admim runserver 注意: django-admin需要提前提前配置好DJANGO_SETTINGS_MODULE環境變量
  • 10道題教你使用python Django框架來實現web應用,值得收藏
    關於定時器:考慮使用django-celery創建一個線程做異步處理,24小時後檢查資料庫中用戶訂單狀態。如果仍然沒有商家接單,則修改訂單狀態。但是這樣可能線程太多,資源消耗太大。可以使用django-celery設置循環任務,比如每隔5分鐘查詢出資料庫中已經超過24小時、但是仍然沒有商家接單的訂單,修改這些訂單的狀態。4、要怎麼樣運行Django裡的程序啊?
  • 「原創」Django第六章、模型操作
    sqlite> .tablesauth_group blog_blogarticlesauth_group_permissions django_admin_logauth_permission django_content_type
  • Django第十八課
    from django.shortcuts import renderfrom django.contrib.contenttypes.models import ContentTypefrom read_count.utils import get_seven_days_read_data, get_today_hot_data
  • Django 1.10中文文檔-聚合
    如果沒有指定這樣的別名,它將是 'book__pubdate__min'.)這不僅僅是在外鍵關係上是這樣。多對多關係也是如此。即使這些欄位沒有在 values() 中指定也會被用到。 這些欄位用來組合「相似」結果,它們可以使相似的結果行看起來是獨立的。尤其是在計數的時候。