路由註冊 - LZerApp/crawlerenv GitHub Wiki

目錄 (🔎 點擊展開/關閉)

前言

當使用者透過客戶端輸入 URL 訪問網際網路上的資源時,網際網路上另一端正運行中的伺服器會接收來自使用者的請求並進行分析,透過對應的函數處理來自特定 URL 的請求並返回響應結果。

在 Flask 中,框架本身提供了開發者透過 app.route() 裝飾器來將函數與 URL 建立關聯,這個過程稱為註冊路由(route registration),而那些與 URL 對應負責產生響應的函數稱為視圖函數(view functions)。除此之外,為了在支援較大架構的同時能夠有效地降低耦合程度,我們可以透過添加藍圖(blueprint)來擴展應用程式功能而不至於影響原來的程式。

英文單字 "route" 本身解釋為路線,在計算機網路中用以指稱網路封包決定要如何送往外部網路而到達目的地的過程。


[ ↥ 回到頂部 ]

一般路由

現代多數的網頁應用程式會使用有意義的 URL 來幫助使用者記憶與訪問頁面,在 Flask 中提供了兩種方式來添加路由:

在絕大多數的狀況下,都是採用裝飾器來註冊路由。


[ ↥ 回到頂部 ]

靜態 URL

以下是一個靜態 URL 的範例:

@app.route('/')
def hello_world():
    return 'Hello, World!'

當然,我們也可以透過多個 route 裝飾器替同一視圖函數添加多個路由:

@app.route('/')
@app.route('/hello')
def hello_world():
    return 'Hello, World!'

[ ↥ 回到頂部 ]

動態 URL

我們也可以使用如 <converter:name> 的格式,在 URL 規則中添加變數來創建動態路由:

@app.route('/user/<username>')
def show_user_profile(username):
    return f'User {username}'

@app.route('/post/<int:post_id>')
def show_post(post_id):
    return f'Post {post_id}'

目前 Flask 所支持的類型轉換器 converter 參數如下:

類型轉換器 說明
string 接受任何不包含斜線 / 的文字,為預設選項
int 接受整數類型
float 接受浮點數類型
path 與預設的 string 參數類似,但可以包含斜線 /
uuid 接受 UUID 字串

開發者甚至可以透過 flask.Flask.url_map 創建自定義的類型轉換器。


[ ↥ 回到頂部 ]

請求方法

超文本傳輸協議(HTTP) 中定義了 GETPOSTPUTDELETEPATCH 等一組請求方法,這些方法用以指示要對給定資源執行的所需操作,有時我們又將這些請求方法統稱為 HTTP 動詞(HTTP Verbs)。在 Flask 的路由規則中,我們也可以設置對應的請求方法:

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return 'This is a POST request.'
    else:
        return 'This is a GET request.'

在上述程式碼中,當我們對 /login 發送請求時,針對 GETPOST 請求會返回不同的內容,而其餘的請求方法則會返回 405 錯誤,這一項設定可以讓我們簡單地實作出符合 REST 風格的 API 接口。


[ ↥ 回到頂部 ]

藍圖模組


[ ↥ 回到頂部 ]

專案架構


[ ↥ 回到頂部 ]

使用藍圖


[ ↥ 回到頂部 ]

視圖函數


[ ↥ 回到頂部 ]

疑難排解

在路由中設定 URL 規則時是否要加上結尾的斜槓

這是一個許多人常犯錯的細節,為了使每個 URL 保持唯一,在 Flask 中處理斜槓的規則如下:

  • 如果 URL 規則以斜杠結尾,並且被使用者請求時沒有斜杠,則將被自動重定向到以斜杠結尾的同一頁面
  • 如果 URL 規則不以斜杠結尾,並且使用者請求時含有斜杠,則引發 404 not found 錯誤

因此 正確的做法是在路由中設定 URL 規則時,結尾必須加上斜槓 來避免上述第二種狀況的發生,這樣的做法也與多數網頁伺服器在處理靜態頁面時相同。


[ ↥ 回到頂部 ]

參考資料


[ ↥ 回到頂部 ]

⚠️ **GitHub.com Fallback** ⚠️