Django 教程第二部分:建立一個骨架網站

這是我們 Django 教程的第二篇文章,它展示瞭如何建立一個“骨架”網站專案作為基礎,然後你可以用特定於網站的設定、路徑、模型、檢視和模板來填充它。

預備知識 設定 Django 開發環境。回顧 Django 教程
目標 能夠使用 Django 的工具來啟動你自己的新網站專案。

概述

本文介紹瞭如何建立一個“骨架”網站,然後你可以用特定於網站的設定、路徑、模型、檢視和模板來填充它(我們將在後面的文章中討論這些)。

開始

  1. 使用 django-admin 工具生成專案資料夾、基本檔案模板和 manage.py,後者作為你的專案管理指令碼。

  2. 使用 manage.py 建立一個或多個應用

    注意:一個網站可能包含一個或多個部分。例如,主站點、部落格、維基、下載區等。Django 鼓勵你將這些元件開發為單獨的應用,如果需要,這些應用可以在不同的專案中重複使用。

  3. 註冊新應用以將其包含在專案中。

  4. 連線每個應用的 url/path 對映器。

對於 Local Library 網站,網站和專案資料夾名為 locallibrary,幷包含一個名為 catalog 的應用。因此,頂級資料夾結構將如下所示:

bash
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)

以下部分將詳細討論過程步驟,並展示如何測試你的更改。在本文末尾,我們將討論在此階段你可能需要進行的其他全站點配置。

建立專案

建立專案

  1. 開啟命令 shell(或終端視窗),並確保你處於 虛擬環境中。

  2. 導航到你想要建立本地圖書館應用的資料夾(稍後我們會將其移動到你在設定開發環境時建立為本地 GitHub 倉庫的“django_local_library”)。

  3. 使用 django-admin startproject 命令建立新專案,然後導航到專案資料夾中,如下所示:

    bash
    django-admin startproject locallibrary
    cd locallibrary
    

    django-admin 工具建立的資料夾/檔案結構如下:

    bash
    locallibrary/
        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 所在的相同資料夾中執行此命令:

bash
# 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 中),幷包含一些用於處理相關物件的最小樣板程式碼。

更新後的專案目錄現在應該看起來像這樣:

bash
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 列表的定義。然後在列表末尾新增新行,如下所示:

bash
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 中檢視此資料庫的配置方式:

python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

稍後在將 Django 部署到生產環境中,我們還將向你展示如何配置 Postgres 資料庫,這可能更適合大型站點。

其他專案設定

settings.py 檔案還用於配置許多其他設定,但目前,你可能只想更改 TIME_ZONE ——這應該等於標準 tz 資料庫時區列表中的字串(表中 TZ 列包含你想要的值)。將你的 TIME_ZONE 值更改為適合你時區的一個字串,例如:

python
TIME_ZONE = 'Europe/London'

還有兩個你現在不會更改,但應該瞭解的設定:

  • SECRET_KEY。這是一個秘密金鑰,用作 Django 網站安全策略的一部分。如果你在開發過程中不保護此程式碼,那麼在將其投入生產時,你需要使用不同的程式碼(可能從環境變數或檔案中讀取)。
  • DEBUG。這會啟用在錯誤時顯示除錯日誌,而不是 HTTP 狀態碼響應。在生產環境中應將其設定為 False,因為除錯資訊對攻擊者很有用,但現在我們可以將其設定為 True

連線 URL 對映器

該網站在專案資料夾中建立了一個 URL 對映檔案(urls.py)。雖然你可以使用此檔案管理所有 URL 對映,但更常見的是將對映延遲到關聯的應用。

開啟 django-locallibrary-tutorial/locallibrary/urls.py 並注意解釋如何使用 URL 對映器的一些說明文字。

python
"""
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 的檔案)。

python
# 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)匹配時。

將以下行新增到檔案底部:

python
# 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 會給出以下警告:

python
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 對映器的最後新增,你可以透過追加以下行來在開發期間啟用靜態檔案服務。

現在將以下最後一塊程式碼新增到檔案底部:

python
# 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 列表(之前,我們只是使用 += 運算子附加了一個新的列表項,以清晰地分離舊程式碼和新程式碼)。我們本可以將此新模式對映包含在原始列表定義中:

python
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。我們將在構建應用時在此處新增我們的模式。

python
from django.urls import path
from . import views

urlpatterns = [

]

測試網站框架

至此,我們有了一個完整的骨架專案。網站實際上還沒有任何事情,但執行它以確保我們的更改沒有破壞任何東西是值得的。

在此之前,我們應該首先執行一次資料庫遷移。這將更新我們的資料庫(以包含我們已安裝應用中的任何模型)並消除一些構建警告。

執行資料庫遷移

Django 使用物件關係對映器(ORM)將 Django 程式碼中的模型定義對映到底層資料庫使用的資料結構。當我們更改模型定義時,Django 會跟蹤這些更改,並可以建立資料庫遷移指令碼(在 /django-locallibrary-tutorial/catalog/migrations/ 中)以自動遷移資料庫中的底層資料結構以匹配模型。

當我們建立網站時,Django 自動添加了許多模型供網站管理部分使用(我們稍後將檢視)。執行以下命令以在資料庫中為這些模型定義表(確保你位於包含 manage.py 的目錄中):

bash
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 伺服器

bash
python3 manage.py runserver

伺服器執行後,你可以在本地 Web 瀏覽器中導航到 http://127.0.0.1:8000/ 檢視站點。你將看到一個站點錯誤頁面,如下所示:

Django Debug page (Django 4.2)

別擔心!這個錯誤頁面是預期的,因為我們在 catalog.urls 模組中沒有定義任何頁面/URL(當我們獲取站點根目錄的 URL 時,我們會重定向到該模組)。

此時,我們知道 Django 正在工作!

注意:示例頁面演示了 Django 的一個強大功能——自動化除錯日誌記錄。每當找不到頁面時,Django 都會顯示一個錯誤螢幕,其中包含有用的資訊或程式碼引發的任何錯誤。在這種情況下,我們可以看到我們提供的 URL 與我們列出的任何 URL 模式都不匹配。日誌記錄在生產環境中(即我們將站點部署到 Web 上時)是關閉的,在這種情況下將提供一個資訊較少但更使用者友好的頁面。

不要忘記備份到 GitHub

我們剛剛完成了一些重要的工作,所以現在是使用 GitHub 備份專案的好時機。

首先,將頂層 locallibrary 資料夾的內容移動到你在設定開發環境時建立的本地 GitHub 倉庫 django_local_library 資料夾中。這將包括 manage.pylocallibrary 子資料夾、catalog 子資料夾以及頂層資料夾中的任何其他內容。

然後,新增並提交 django_local_library 資料夾中的更改,並將其推送到 GitHub。從該資料夾的根目錄,你可以使用與《開發環境》主題的修改和同步更改部分中類似的命令集:

bash
# 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 拉取你的更改:

bash
git checkout main
git pull origin main

注意:如果你不刪除 skeleton_website 分支,你可以在稍後的任何時候切換回它。

將來我們不一定會再次提及這一點,但你可能會發現在本教程的每個部分結束時更新 GitHub 上的更改很有用。

挑戰自我

catalog/ 目錄包含檢視、模型和應用其他部分的檔案。開啟這些檔案並檢查樣板程式碼。

如前所述,Admin 站點的 URL 對映已新增到專案的 urls.py 中。在瀏覽器中導航到管理區域,看看會發生什麼(你可以從對映推斷出正確的 URL)。

總結

你現在已經建立了一個完整的骨架網站專案,你可以繼續用 URL、模型、檢視和模板填充它。

現在 Local Library 網站的骨架已完成並執行,是時候開始編寫程式碼,讓這個網站實現其應有的功能了。

另見