python django-url路由系統

路由 (urls.py) 的作用

在 Django 中,URL 路由扮演著網站「導航員」的角色。當使用者在瀏覽器中輸入一個網址時,Django 會依序檢查你的 urls.py 檔案,找到一個符合的規則,然後將請求轉交給對應的視圖(View)來處理。

Django 專案有兩個主要的 urls.py 檔案:

  1. 專案級別myproject/urls.py:負責管理整個網站的頂層路由。
  2. 應用程式級別blog/urls.py:負責管理特定應用程式(如 blog)內部的所有路由。

這種分離的結構讓你的程式碼更有組織。

path() 函式

path() 是最常用來定義 URL 的函式。它的基本用法是:

path(route, view, name=None)
  • route: 一個字串,定義了 URL 的路徑。
  • view: 一個函數或類別,用來處理該 URL 的請求。
  • name: 選用參數,給這個 URL 命名,方便在程式碼中引用,避免硬編碼。

實作: 讓我們來建立第一個 URL 路由。

  1. 打開 blog 資料夾下的 views.py 檔案,並新增一個視圖函數:

    # blog/views.py
    
    from django.shortcuts import render
    from django.http import HttpResponse
    
    def hello(request):
        return HttpResponse("Hello from Django!")
    
  2. 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 處理。

  1. 打開專案根目錄的 myproject/urls.py 檔案。

  2. 匯入 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 中傳遞參數,這對於顯示特定資源的頁面非常有用。

  1. 修改 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}")
    
  2. 修改 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),從而提供正確的內容。