在 Flask 開發中,url_for()
與 redirect()
是實現路由跳轉邏輯的核心工具。
url_for()
負責安全、靈活地生成 URL。
redirect()
負責發起重定向響應。
1、url_for()
:生成URL
url_for(endpoint, **values)
是 Flask 提供的 URL 構造工具,可根據路由端點(即視圖函數名)動態生成對應路徑。
那么這里的“路由端點”是哪來的呢?
通過“路由裝飾器”生成的Rule
對象,保存在app.url_map
里的。
關于Flask路由裝飾器,可以看這一篇:Flask 路由裝飾器:從 URL 到視圖函數的優雅映射
1.1、基本語法
url_for(endpoint, **values)
endpoint
:視圖函數名(字符串)**values
:動態參數、查詢參數、特殊參數(如_external
,_anchor
)
1.2、使用方式
1.2.1、生成靜態路徑(無參數)
避免硬編碼 URL 路徑,提高代碼維護性:
url_for('home') # -> '/home'
1.2.2、綁定一個動態參數
支持綁定動態路由參數,靈活生成對應路徑:
url_for('profile', username='alice') # -> '/user/alice'
1.2.3、綁定多個動態參數或附加查詢參數
支持附加查詢參數,方便傳遞額外信息:
url_for('profile', username='alice', page=2) # -> '/user/alice?page=2'
1.2.4、生成絕對路徑(帶域名)
適合需要外部訪問或郵件鏈接場景,生成完整 URL:
url_for('profile', username='alice', _external=True) # -> 'http://localhost/user/alice'
1.2.5、帶錨點(fragment)
支持 URL 片段定位,增強用戶體驗:
url_for('home', _anchor='top') # -> '/home#top'
2、redirect()
:頁面重定向
redirect(location, code=302)
是 Flask 提供的重定向函數,用于生成重定向響應,提示客戶端跳轉到新的 URL。
2.1、基本語法
redirect(location, code=302)
location
:目標 URL- 可以是相對路徑(如
/home
)、絕對路徑(如http://example.com
),或通過url_for()
構造而得。
- 可以是相對路徑(如
code
:HTTP 狀態碼,默認是302
,表示臨時重定向。302
(默認):臨時重定向,常用于普通頁面跳轉。
瀏覽器通常會將 POST 請求在接收到 302 后,轉換為 GET 請求重新發起,這種行為是為了避免表單重復提交,屬于瀏覽器的歷史兼容實現。301
:永久重定向,適用于 URL 變更。303
:明確告知瀏覽器用 GET 請求訪問重定向目標,適合 POST 請求后的跳轉,規范避免了 302 狀態下瀏覽器不一致的行為。307
:保持原請求方法(如 POST 仍為 POST),用于需要嚴格保留請求語義的場景(如 API 調用)。
HTTP 狀態碼
303
和307
都是在HTTP/1.1 標準(RFC 2616)
中首次引入的,用于補充和細化原本模糊不清的302
重定向行為。
2.2、示例
from flask import redirect@app.route('/old')
def old():return redirect('/new') # 臨時重定向到 /new,默認狀態碼 302@app.route('/submit', methods=['POST'])
def submit():# 處理表單后用 303 重定向,確保瀏覽器用 GET 請求跳轉return redirect(url_for('success'), code=303)@app.route('/external')
def external():return redirect('https://example.com', code=301) # 永久重定向到外部鏈接
3、組合使用:優雅地跳轉邏輯
以下是一個實際場景:主頁判斷用戶是否已登錄,并進行相應跳轉。
@app.route('/')
def index():if 'username' in session:return redirect(url_for('profile')) # 登錄后跳轉到個人頁面return redirect(url_for('login'))
這個例子體現了 url_for
與 redirect
的協同作用:
url_for('profile')
與url_for('login')
提供靈活、安全的 URL 構造。redirect(...)
返回重定向響應,引導客戶端跳轉。- 當路由或參數發生變動時,無需修改跳轉邏輯,只需調整對應的視圖函數即可。