Django 教程第二部分:建立一個骨架網站
這是我們 Django 教程的第二篇文章,它展示瞭如何建立一個“骨架”網站專案作為基礎,然後你可以用特定於網站的設定、路徑、模型、檢視和模板來填充它。
| 預備知識 | 設定 Django 開發環境。回顧 Django 教程。 |
|---|---|
| 目標 | 能夠使用 Django 的工具來啟動你自己的新網站專案。 |
概述
本文介紹瞭如何建立一個“骨架”網站,然後你可以用特定於網站的設定、路徑、模型、檢視和模板來填充它(我們將在後面的文章中討論這些)。
開始
-
使用
django-admin工具生成專案資料夾、基本檔案模板和 manage.py,後者作為你的專案管理指令碼。 -
使用 manage.py 建立一個或多個應用。
注意:一個網站可能包含一個或多個部分。例如,主站點、部落格、維基、下載區等。Django 鼓勵你將這些元件開發為單獨的應用,如果需要,這些應用可以在不同的專案中重複使用。
-
註冊新應用以將其包含在專案中。
-
連線每個應用的 url/path 對映器。
對於 Local Library 網站,網站和專案資料夾名為 locallibrary,幷包含一個名為 catalog 的應用。因此,頂級資料夾結構將如下所示:
locallibrary/ # Website folder
manage.py # Script to run Django tools for this project (created using django-admin)
locallibrary/ # Website/project folder (created using django-admin)
catalog/ # Application folder (created using manage.py)
以下部分將詳細討論過程步驟,並展示如何測試你的更改。在本文末尾,我們將討論在此階段你可能需要進行的其他全站點配置。
建立專案
建立專案
-
開啟命令 shell(或終端視窗),並確保你處於 虛擬環境中。
-
導航到你想要建立本地圖書館應用的資料夾(稍後我們會將其移動到你在設定開發環境時建立為本地 GitHub 倉庫的“django_local_library”)。
-
使用
django-admin startproject命令建立新專案,然後導航到專案資料夾中,如下所示:bashdjango-admin startproject locallibrary cd locallibrarydjango-admin工具建立的資料夾/檔案結構如下:bashlocallibrary/ manage.py locallibrary/ __init__.py settings.py urls.py wsgi.py asgi.py
locallibrary 專案子資料夾是網站的入口點
- __init__.py 是一個空檔案,它指示 Python 將此目錄視為一個 Python 包。
- settings.py 包含所有網站設定,包括註冊我們建立的任何應用、靜態檔案位置、資料庫配置詳細資訊等。
- urls.py 定義站點 URL 到檢視的對映。雖然它可以包含所有 URL 對映程式碼,但更常見的是將一些對映委託給特定應用,稍後你將看到。
- wsgi.py 用於幫助你的 Django 應用與 Web 伺服器通訊。你可以將其視為樣板檔案。
- asgi.py 是 Python 非同步 Web 應用和伺服器之間相互通訊的標準。非同步伺服器閘道器介面(ASGI)是 Web 伺服器閘道器介面(WSGI)的非同步後繼者。ASGI 為非同步和同步 Python 應用提供了標準,而 WSGI 僅為同步應用提供了標準。ASGI 與 WSGI 向後相容,並支援多個伺服器和應用框架。
manage.py 指令碼用於建立應用、處理資料庫和啟動開發 Web 伺服器。
建立 catalog 應用
接下來,執行以下命令建立將存在於我們的 locallibrary 專案中的 catalog 應用。確保在專案 manage.py 所在的相同資料夾中執行此命令:
# Linux/macOS
python3 manage.py startapp catalog
# Windows
py manage.py startapp catalog
注意:本教程的其餘部分使用 Linux/macOS 語法。如果你在 Windows 上工作,無論你看到以 python3 開頭的命令,都應改為使用 py(或 py -3)。
該工具建立一個新資料夾,並用用於應用不同部分的檔案填充它(如下例所示)。大多數檔案以其目的命名(例如,檢視應儲存在 views.py 中,模型儲存在 models.py 中,測試儲存在 tests.py 中,管理站點配置儲存在 admin.py 中,應用註冊儲存在 apps.py 中),幷包含一些用於處理相關物件的最小樣板程式碼。
更新後的專案目錄現在應該看起來像這樣:
locallibrary/
manage.py
locallibrary/
catalog/
admin.py
apps.py
models.py
tests.py
views.py
__init__.py
migrations/
此外,我們現在還有:
- 一個 migrations 資料夾,用於儲存“遷移”——允許你在修改模型時自動更新資料庫的檔案。
- __init__.py — 在此處建立的空檔案,以便 Django/Python 將該資料夾識別為 Python 包,並允許你在專案的其他部分使用其物件。
注意:你是否注意到上面檔案列表中缺少什麼?雖然有檢視和模型的位置,但沒有放置 URL 對映、模板和靜態檔案的地方。我們將向你展示如何進一步建立它們(這些並非每個網站都必需,但在此示例中需要)。
註冊 catalog 應用
現在應用已建立,我們必須向專案註冊它,以便在執行任何工具時(例如將模型新增到資料庫)將其包含在內。透過將其新增到專案設定中的 INSTALLED_APPS 列表來註冊應用。
開啟專案設定檔案 django-locallibrary-tutorial/locallibrary/settings.py,找到 INSTALLED_APPS 列表的定義。然後在列表末尾新增新行,如下所示:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# Add our new application
'catalog.apps.CatalogConfig', # This object was created for us in /catalog/apps.py
]
新行指定了你在建立應用時在 /django-locallibrary-tutorial/catalog/apps.py 中為你生成的應用配置物件 (CatalogConfig)。
注意:你會注意到已經有很多其他的 INSTALLED_APPS(以及 MIDDLEWARE,在設定檔案中更靠下)。這些啟用了對 Django 管理站點及其所用功能(包括會話、身份驗證等)的支援。
指定資料庫
這也是你通常會指定專案使用的資料庫的地方。在可能的情況下,開發和生產使用相同的資料庫是有意義的,以避免行為上的微小差異。你可以在 資料庫(Django 文件)中瞭解不同的選項。
在本示例的大部分內容中,我們將使用預設的 SQLite 資料庫,因為我們預計在演示資料庫上不需要大量的併發訪問,並且它無需額外工作即可設定!你可以在 settings.py 中檢視此資料庫的配置方式:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
稍後在將 Django 部署到生產環境中,我們還將向你展示如何配置 Postgres 資料庫,這可能更適合大型站點。
其他專案設定
settings.py 檔案還用於配置許多其他設定,但目前,你可能只想更改 TIME_ZONE ——這應該等於標準 tz 資料庫時區列表中的字串(表中 TZ 列包含你想要的值)。將你的 TIME_ZONE 值更改為適合你時區的一個字串,例如:
TIME_ZONE = 'Europe/London'
還有兩個你現在不會更改,但應該瞭解的設定:
SECRET_KEY。這是一個秘密金鑰,用作 Django 網站安全策略的一部分。如果你在開發過程中不保護此程式碼,那麼在將其投入生產時,你需要使用不同的程式碼(可能從環境變數或檔案中讀取)。DEBUG。這會啟用在錯誤時顯示除錯日誌,而不是 HTTP 狀態碼響應。在生產環境中應將其設定為False,因為除錯資訊對攻擊者很有用,但現在我們可以將其設定為True。
連線 URL 對映器
該網站在專案資料夾中建立了一個 URL 對映檔案(urls.py)。雖然你可以使用此檔案管理所有 URL 對映,但更常見的是將對映延遲到關聯的應用。
開啟 django-locallibrary-tutorial/locallibrary/urls.py 並注意解釋如何使用 URL 對映器的一些說明文字。
"""
URL configuration for locallibrary project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/5.0/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLConf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]
URL 對映透過 urlpatterns 變數管理,該變數是一個 Python path() 函式的列表。每個 path() 函式要麼將 URL 模式關聯到特定檢視(當模式匹配時將顯示該檢視),要麼關聯到另一個 URL 模式測試程式碼列表(在第二種情況下,該模式成為目標模組中定義的模式的“基本 URL”)。urlpatterns 列表最初定義了一個單個函式,它將所有具有 admin/ 模式的 URL 對映到 admin.site.urls 模組,該模組包含管理應用自己的 URL 對映定義。
注意:path() 中的路由是一個定義要匹配的 URL 模式的字串。此字串可能包含一個命名變數(在尖括號中),例如 'catalog/<id>/'。此模式將匹配類似 catalog/any_chars/ 的 URL,並將 any_chars 作為字串傳遞給檢視,引數名為 id。我們將在後面的主題中進一步討論路徑方法和路由模式。
要將新列表項新增到 urlpatterns 列表中,請將以下行新增到檔案底部。此新項包含一個 path(),它將具有模式 catalog/ 的請求轉發到 catalog.urls 模組(帶有相對 URL catalog/urls.py 的檔案)。
# Use include() to add paths from the catalog application
from django.urls import include
urlpatterns += [
path('catalog/', include('catalog.urls')),
]
注意:請注意,我們包含匯入行(from django.urls import include)及其使用程式碼(這樣很容易看出我們添加了什麼),但通常將所有匯入行包含在 Python 檔案的頂部。
現在,讓我們將站點的根 URL(即 127.0.0.1:8000)重定向到 URL 127.0.0.1:8000/catalog/。這是我們在此專案中將使用的唯一應用。為此,我們將使用一個特殊的檢視函式 RedirectView,它將要重定向到的新相對 URL (/catalog/) 作為其第一個引數,當 path() 函式中指定的 URL 模式(在這種情況下是根 URL)匹配時。
將以下行新增到檔案底部:
# Add URL maps to redirect the base URL to our application
from django.views.generic import RedirectView
urlpatterns += [
path('', RedirectView.as_view(url='catalog/', permanent=True)),
]
將 path 函式的第一個引數留空表示 '/'。如果你將第一個引數寫為 '/',當你啟動開發伺服器時,Django 會給出以下警告:
System check identified some issues:
WARNINGS:
?: (urls.W002) Your URL pattern '/' has a route beginning with a '/'.
Remove this slash as it is unnecessary.
If this pattern is targeted in an include(), ensure the include() pattern has a trailing '/'.
Django 預設不提供 CSS、JavaScript 和影像等靜態檔案,但對於開發 Web 伺服器來說,在你建立站點時這樣做可能很有用。作為此 URL 對映器的最後新增,你可以透過追加以下行來在開發期間啟用靜態檔案服務。
現在將以下最後一塊程式碼新增到檔案底部:
# Use static() to add URL mapping to serve static files during development (only)
from django.conf import settings
from django.conf.urls.static import static
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
注意:有多種方法可以擴充套件 urlpatterns 列表(之前,我們只是使用 += 運算子附加了一個新的列表項,以清晰地分離舊程式碼和新程式碼)。我們本可以將此新模式對映包含在原始列表定義中:
urlpatterns = [
path('admin/', admin.site.urls),
path('catalog/', include('catalog.urls')),
path('', RedirectView.as_view(url='catalog/')),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
最後一步,在 catalog 資料夾中建立一個名為 urls.py 的檔案,並新增以下文字來定義(空的)匯入的 urlpatterns。我們將在構建應用時在此處新增我們的模式。
from django.urls import path
from . import views
urlpatterns = [
]
測試網站框架
至此,我們有了一個完整的骨架專案。網站實際上還沒有做任何事情,但執行它以確保我們的更改沒有破壞任何東西是值得的。
在此之前,我們應該首先執行一次資料庫遷移。這將更新我們的資料庫(以包含我們已安裝應用中的任何模型)並消除一些構建警告。
執行資料庫遷移
Django 使用物件關係對映器(ORM)將 Django 程式碼中的模型定義對映到底層資料庫使用的資料結構。當我們更改模型定義時,Django 會跟蹤這些更改,並可以建立資料庫遷移指令碼(在 /django-locallibrary-tutorial/catalog/migrations/ 中)以自動遷移資料庫中的底層資料結構以匹配模型。
當我們建立網站時,Django 自動添加了許多模型供網站管理部分使用(我們稍後將檢視)。執行以下命令以在資料庫中為這些模型定義表(確保你位於包含 manage.py 的目錄中):
python3 manage.py makemigrations
python3 manage.py migrate
警告:每當你的模型發生變化,並且這些變化會影響需要儲存的資料結構時(包括新增和刪除整個模型以及單個欄位),你都需要執行這些命令。
makemigrations 命令為專案中安裝的所有應用建立(但不應用)遷移。你也可以指定應用名稱,只為單個應用執行遷移。這讓你有機會在應用這些遷移之前檢查其程式碼。如果你是 Django 專家,你可能會選擇稍微調整它們!
migrate 命令是將遷移應用到資料庫的命令。Django 會跟蹤哪些遷移已新增到當前資料庫。
注意:每當你進行重大更改時,都應重新執行遷移並重新測試站點。這不會花費很長時間!
有關較少使用的遷移命令的更多資訊,請參閱 遷移(Django 文件)。
執行網站
在開發過程中,你可以首先使用開發 Web 伺服器來提供網站,然後透過本地 Web 瀏覽器檢視它。
注意:開發 Web 伺服器不夠健壯或效能不足以用於生產環境,但它是在開發過程中快速啟動和執行 Django 網站以方便快速測試的非常簡單的方法。預設情況下,它將站點服務於你的本地計算機(http://127.0.0.1:8000/),但你也可以指定網路上的其他計算機進行服務。有關更多資訊,請參閱 django-admin 和 manage.py: runserver(Django 文件)。
透過呼叫 runserver 命令(在與 manage.py 相同的目錄中)執行開發 Web 伺服器:
python3 manage.py runserver
伺服器執行後,你可以在本地 Web 瀏覽器中導航到 http://127.0.0.1:8000/ 檢視站點。你將看到一個站點錯誤頁面,如下所示:

別擔心!這個錯誤頁面是預期的,因為我們在 catalog.urls 模組中沒有定義任何頁面/URL(當我們獲取站點根目錄的 URL 時,我們會重定向到該模組)。
此時,我們知道 Django 正在工作!
注意:示例頁面演示了 Django 的一個強大功能——自動化除錯日誌記錄。每當找不到頁面時,Django 都會顯示一個錯誤螢幕,其中包含有用的資訊或程式碼引發的任何錯誤。在這種情況下,我們可以看到我們提供的 URL 與我們列出的任何 URL 模式都不匹配。日誌記錄在生產環境中(即我們將站點部署到 Web 上時)是關閉的,在這種情況下將提供一個資訊較少但更使用者友好的頁面。
不要忘記備份到 GitHub
我們剛剛完成了一些重要的工作,所以現在是使用 GitHub 備份專案的好時機。
首先,將頂層 locallibrary 資料夾的內容移動到你在設定開發環境時建立的本地 GitHub 倉庫 django_local_library 資料夾中。這將包括 manage.py、locallibrary 子資料夾、catalog 子資料夾以及頂層資料夾中的任何其他內容。
然後,新增並提交 django_local_library 資料夾中的更改,並將其推送到 GitHub。從該資料夾的根目錄,你可以使用與《開發環境》主題的修改和同步更改部分中類似的命令集:
# Get the current source from GitHub on the main branch
git checkout main
git pull origin main
# Create a branch and add/commit your newly created app skeleton
git checkout -b skeleton_website # Create and activate a new branch "skeleton_website"
git add -A # Add all changed files to the staging area
git commit -m "Create Skeleton framework for LocalLibrary" # Commit the changed files
# Push the branch to GitHub
git push origin skeleton_website
然後從你的 GitHub 倉庫建立併合並一個 PR。合併後,你可以切換回 main 分支並從 GitHub 拉取你的更改:
git checkout main
git pull origin main
注意:如果你不刪除 skeleton_website 分支,你可以在稍後的任何時候切換回它。
將來我們不一定會再次提及這一點,但你可能會發現在本教程的每個部分結束時更新 GitHub 上的更改很有用。
挑戰自我
catalog/ 目錄包含檢視、模型和應用其他部分的檔案。開啟這些檔案並檢查樣板程式碼。
如前所述,Admin 站點的 URL 對映已新增到專案的 urls.py 中。在瀏覽器中導航到管理區域,看看會發生什麼(你可以從對映推斷出正確的 URL)。
總結
你現在已經建立了一個完整的骨架網站專案,你可以繼續用 URL、模型、檢視和模板填充它。
現在 Local Library 網站的骨架已完成並執行,是時候開始編寫程式碼,讓這個網站實現其應有的功能了。
另見
- 編寫你的第一個 Django 應用 - 第 1 部分(Django 文件)
- 應用(Django 文件)。包含有關配置應用的資訊。