路由 (urls.py) 的作用
在 Django 中,URL 路由扮演著網站「導航員」的角色。當使用者在瀏覽器中輸入一個網址時,Django 會依序檢查你的 urls.py 檔案,找到一個符合的規則,然後將請求轉交給對應的視圖(View)來處理。
Django 專案有兩個主要的 urls.py 檔案:
- 專案級別的
myproject/urls.py:負責管理整個網站的頂層路由。 - 應用程式級別的
blog/urls.py:負責管理特定應用程式(如blog)內部的所有路由。
這種分離的結構讓你的程式碼更有組織。
path() 函式
path() 是最常用來定義 URL 的函式。它的基本用法是:
path(route, view, name=None)
route: 一個字串,定義了 URL 的路徑。view: 一個函數或類別,用來處理該 URL 的請求。name: 選用參數,給這個 URL 命名,方便在程式碼中引用,避免硬編碼。
實作: 讓我們來建立第一個 URL 路由。
-
打開
blog資料夾下的views.py檔案,並新增一個視圖函數:# blog/views.py from django.shortcuts import render from django.http import HttpResponse def hello(request): return HttpResponse("Hello from Django!") -
在
blog資料夾中,建立一個名為urls.py的新檔案,並新增以下內容:# blog/urls.py from django.urls import path from . import views # 從當前資料夾匯入 views.py urlpatterns = [ path('', views.hello, name='hello_page'), ]這段程式碼定義了一個路徑為空字串
''的路由,表示當使用者訪問blog應用程式的根目錄時,會觸發views.py中的hello函數。
include() 函式
現在,我們需要告訴專案級別的 urls.py,把所有關於 blog 應用程式的請求都轉給 blog/urls.py 處理。
-
打開專案根目錄的
myproject/urls.py檔案。 -
匯入
include函式,並修改urlpatterns列表:# myproject/urls.py from django.contrib import admin from django.urls import path, include # 匯入 include urlpatterns = [ path('admin/', admin.site.urls), path('blog/', include('blog.urls')), # 新增這一行 ]path('blog/', ...): 這表示任何以/blog/開頭的 URL 都會被這個路由處理。include('blog.urls'): 這告訴 Django,將剩餘的 URL 路徑交給blog應用程式的urls.py來處理。
帶參數的 URL
path() 函式也支援在 URL 中傳遞參數,這對於顯示特定資源的頁面非常有用。
-
修改
blog/views.py,新增一個帶參數的視圖函數:# blog/views.py from django.shortcuts import render from django.http import HttpResponse def hello(request): return HttpResponse("Hello from Django!") def show_article(request, article_id): return HttpResponse(f"Showing article with ID: {article_id}") -
修改
blog/urls.py,新增一個帶參數的路由:# blog/urls.py from django.urls import path from . import views urlpatterns = [ path('', views.hello, name='hello_page'), path('article/<int:article_id>/', views.show_article, name='article_detail'), ]<int:article_id>: 這是 Django 的轉換器(Converter)。它表示 URL 的這個部分會被當作一個整數(int)變數,並以article_id的名稱傳遞給views.py中的函數。
re_path() 函式
re_path() 使用正規表達式(Regular Expression)來匹配 URL,這在需要更複雜的 URL 匹配時非常有用。
- 實作:
# blog/urls.py # ... from django.urls import path, re_path from . import views urlpatterns = [ # ... re_path(r'^article/(?P<article_id>[0-9]+)/$', views.show_article, name='re_article_detail'), ]re_path的語法比path複雜,因此在非必要的情況下,建議優先使用path。
總結與練習
- 運行伺服器: 執行
python manage.py runserver。 - 測試 URL: 在瀏覽器中輸入
http://127.0.0.1:8000/blog/和http://127.0.0.1:8000/blog/article/123/,檢查是否能正常顯示。
Django URL 路由系統:網站的導航地圖
想像一下,你的 Django 網站就像一個大型的商場,而你的使用者就是顧客。
-
urls.py檔:這就像商場裡的導航地圖。這張地圖清楚地標示了每個區域(URL)通往哪一個商店(View),以及這個區域叫什麼名字(name)。 -
path()函式:這是地圖上最常見的標示。- 例子:
path('blog/', views.blog_index)blog/:這告訴你,如果要找「部落格」區域,請走這條路。views.blog_index:這告訴你,走進去後,你會找到一間叫blog_index的店,它會告訴你部落格的所有內容。
- 例子:
-
帶參數的
path():這就像地圖上的快速通道。- 例子:
path('article/<int:article_id>/', views.show_article)<int:article_id>:這表示這條路會通往很多家店,但每家店都有一個特別的編號。這個編號會被傳給店員,讓他們知道你要找的是哪一個。views.show_article:這家店的店員會根據你提供的編號(article_id),從倉庫裡找出對應的商品(文章),然後交給你。
- 例子:
-
include()函式:這就像商場裡區域導覽圖。- 專案
urls.py:這是商場的總導覽圖。 -
應用程式
urls.py:這是「美食街」或「服飾區」的區域導覽圖。 - 例子:在總導覽圖(專案
urls.py)上,你可能會看到:path('blog/', include('blog.urls'))- 這告訴你,如果你想去部落格區,先走到
blog/的路口。 - 進入後,你會看到另一張更詳細的區域導覽圖(
blog.urls),它會告訴你部落格區內所有店家的詳細位置。
- 這告訴你,如果你想去部落格區,先走到
- 專案
總結來說,Django 的 URL 路由系統就是一個聰明的導航員,它根據使用者輸入的網址,精準地將他們引導到對應的程式碼區塊(View),從而提供正確的內容。