Django 教程第 2 部分:建立網站框架
我們 Django 教程 中的第二篇文章將介紹如何建立一個“框架”網站專案作為基礎,然後可以用特定於站點的設定、路徑、模型、檢視和模板填充它。
| 先決條件 | 設定 Django 開發環境。回顧 Django 教程。 |
|---|---|
| 目標 | 能夠使用 Django 的工具開始您自己的新網站專案。 |
概述
本文介紹如何建立一個“框架”網站,然後可以用特定於站點的設定、路徑、模型、檢視和模板填充它(我們將在後面的文章中討論這些)。
開始
- 使用
django-admin工具生成一個專案資料夾、基本檔案模板和 manage.py,它用作您的專案管理指令碼。 - 使用 manage.py 建立一個或多個應用程式。
注意:一個網站可能包含一個或多個部分。例如,主站點、部落格、維基、下載區域等。Django 鼓勵您將這些元件開發為獨立的應用程式,然後可以根據需要在不同的專案中重複使用。
- 註冊新的應用程式以將其包含在專案中。
- 為每個應用程式連線 url/path 對映器。
對於 本地圖書館網站,網站和專案資料夾名為 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 伺服器。
建立目錄應用程式
接下來,執行以下命令建立將位於 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 對映、模板和靜態檔案。我們將在後面向您展示如何建立它們(這些並不需要在每個網站中,但在此示例中需要)。
註冊目錄應用程式
現在已經建立了應用程式,我們必須將其註冊到專案中,以便它在執行任何工具(例如,將模型新增到資料庫中)時被包含在內。透過將應用程式新增到專案設定中的 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
]
新行指定了應用程式配置物件 (CatalogConfig),該物件是在您建立應用程式時在 /django-locallibrary-tutorial/catalog/apps.py 中為我們生成的。
注意:您會注意到,這裡已經有很多其他 INSTALLED_APPS(以及 MIDDLEWARE,位於設定檔案中的更下方)。這些啟用了對 Django 管理站點 及其使用的功能(包括會話、身份驗證等)的支援。
指定資料庫
這也是通常指定用於專案的資料庫的地方。最好儘可能使用相同的資料庫進行開發和生產,以避免出現細微的行為差異。您可以在 Databases(Django 文件)中瞭解有關不同選項的資訊。
在大多數情況下,我們將使用預設的 SQLite 資料庫,因為我們預計不會在演示資料庫上需要大量的併發訪問,而且它不需要任何額外的設定!您可以在 settings.py 中看到此資料庫是如何配置的
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
在後面的 將 Django 部署到生產環境 中,我們還將向您展示如何配置 Postgres 資料庫,這可能更適合大型站點。
其他專案設定
settings.py 檔案還用於配置許多其他設定,但在此時,您可能只想更改 TIME_ZONE——這應該與標準 List of tz database time zones 中的字串相等(表格中的 TZ 列包含您想要的 value)。將 TIME_ZONE value 更改為適合您時區的這些字串中的一個,例如
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 變數管理的,它是一個包含 path() 函式的 Python 列表。每個 path() 函式都將 URL 模式與一個特定檢視關聯起來,該檢視將在匹配模式時顯示,或者與另一個 URL 模式測試程式碼列表關聯起來(在這種情況下,該模式將成為目標模組中定義的模式的“基本 URL”)。urlpatterns 列表最初定義了一個單一函式,該函式將所有具有模式 admin/ 的 URL 對映到模組 admin.site.urls,該模組包含管理應用程式自己的 URL 對映定義。
注意:path() 中的路由是定義要匹配的 URL 模式的字串。此字串可能包含一個命名變數(在尖括號中),例如 'catalog/。此模式將匹配類似 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,該函式在匹配 path() 函式中指定的 URL 模式(在本例中為根 URL)時,將新的相對 URL(/catalog/)作為其第一個引數。
在檔案底部新增以下行
# 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)),
]
將路徑函式的第一個引數留空以暗示 '/'. 如果將第一個引數寫為 '/',則在啟動開發伺服器時,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/ 目錄包含應用程式的檢視、模型和其他部分的檔案。開啟這些檔案並檢查樣板程式碼。
正如您之前所見,專案中的 urls.py 中已經添加了管理員網站的 URL 對映。在瀏覽器中導航到管理員區域,看看會發生什麼(您可以從對映中推斷出正確的 URL)。
總結
現在,您已經建立了一個完整的框架網站專案,您可以繼續用 URL、模型、檢視和模板填充它。
現在 本地圖書館網站 的框架已經完成並正在執行,是時候開始編寫使這個網站執行預期功能的程式碼了。
另請參閱
- 編寫您的第一個 Django 應用程式 - 第 1 部分(Django 文件)。
- 應用程式(Django 文件)。包含有關配置應用程式的資訊。