Flask 路由跳轉機制:url_for生成動態URL、redirect頁面重定向

在 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 狀態碼 303307 都是在 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_forredirect 的協同作用:

  • url_for('profile')url_for('login') 提供靈活、安全的 URL 構造。
  • redirect(...) 返回重定向響應,引導客戶端跳轉。
  • 當路由或參數發生變動時,無需修改跳轉邏輯,只需調整對應的視圖函數即可。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/81425.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81425.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81425.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華為OD機試真題——構成正方形的數量(2025B卷:100分)Java/python/JavaScript/C++/C/GO六種最佳實現

2025 B卷 100分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析; 并提供Java、python、JavaScript、C++、C語言、GO六種語言的最佳實現方式! 本文收錄于專欄:《2025華為OD真題目錄+全流程解析/備考攻略/經驗分享》 華為OD機試真題《構成…

FFMPEG-AAC編碼

一、流程圖 二、代碼解釋 avcodec_find_encoder: 根據指定的AVCodecID查找注冊的編碼器。avcodec_alloc_context3: 為AVCodecContext分配內存。()avcodec_open2: 打開編碼器。avcodec_send_frame: 將AVFrame?壓縮數據給編碼器。avcodec_receive_packet: 獲取到編碼后的…

RPC 協議詳解、案例分析與應用場景

一、RPC 協議原理詳解 RPC 協議的核心目標是讓開發者像調用本地函數一樣調用遠程服務,其實現過程涉及多個關鍵組件與流程。 (一)核心組件 客戶端(Client):發起遠程過程調用的一方,它并不關心調…

Docker基礎 -- Ubuntu 22.04 AArch64 交叉編譯 Docker 鏡像構建指南

Ubuntu 22.04 AArch64 交叉編譯 Docker 鏡像構建指南 作者: (填寫作者) 發布日期: 2025?05?26 1 背景與目標 在企業內網(需要代理)環境下,我們需要一套可靠、可復用的 Ubuntu 22.04 交叉編…

【ISP算法精粹】ISP算法管線的預處理算法有哪些?

1. ISP預處理算法有哪些? 在圖像信號處理(ISP)流程中,預處理階段主要針對圖像傳感器(如CMOS/CCD)輸出的原始圖像數據(通常為拜耳格式的RAW圖像)進行初步處理,以校正硬件…

華為OD機試真題——字符串加密 (2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳實現

2025 B卷 100分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析; 本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分…

視頻存儲開源方案

項目成熟度 GitHub - ceph/ceph: Ceph is a distributed object, block, and file storage platform GitHub - minio/minio: MinIO is a high-performance, S3 compatible object store, open sourced under GNU AGPLv3 license. GitHub - seaweedfs/seaweedfs: SeaweedFS i…

典型城市工況數據(Drive Cycle)用于車輛仿真

典型城市工況數據(Drive Cycle)用于車輛仿真 在車輛仿真過程中,使用典型的城市工況數據(Drive Cycle)是評估車輛性能、能耗和排放的關鍵步驟。以下是一些常用的典型城市工況數據及其來源,這些數據可以幫助…

深度解析新能源汽車結構與工作原理

一、核心系統架構 新能源汽車主要由三大核心系統構成: 電力驅動系統:包含永磁同步電機、電機控制器(MCU)及減速器,采用三合一集成設計實現輕量化。永磁同步電機通過電磁感應原理將電能轉化為機械能,其效率可…

跳板問題(貪心算法+細節思考)

首先直接看題&#xff1a; 這題直接貪心其實問題不大&#xff1a; 下面先展示我的一個錯誤代碼&#xff1a; # include<iostream> # include<vector> # include<algorithm>using namespace std;int main() {int N,M;cin>>N>>M;vector<vecto…

pgsql 一些用法

要查詢PostgreSQL數據庫中剩余的磁盤空間&#xff0c;可以使用以下方法&#xff1a; 使用SQL查詢函數&#xff1a; 可以通過pg_size_pretty函數來查看數據庫的總磁盤使用情況&#xff0c;例如&#xff1a; SELECT pg_size_pretty(pg_database_size(‘your_database_name’)); …

【三維重建】【3DGS系列】【深度學習】3DGS的理論基礎知識之如何形成高斯橢球

【三維重建】【3DGS系列】【深度學習】3DGS的理論基礎知識之如何形成高斯橢球 文章目錄 【三維重建】【3DGS系列】【深度學習】3DGS的理論基礎知識之如何形成高斯橢球前言高斯函數一維高斯多維高斯 橢球基本定義一般二次形式 3D高斯橢球3D高斯與橢球的關系各向同性(Isotropic)和…

unix的定時任務和quartz和spring schedule的cron表達式區別

一、核心區別對比表 對比項Unix CrontabQuartzSpring Scheduled表達式位數5 位6 位或 7 位6 位秒級支持? 不支持&#xff08;最小單位是分鐘&#xff09;? 支持? 支持年字段? 無? 可選第7位? 不支持特殊符號支持較少&#xff08;如 *, ,, -, /&#xff09;很豐富和 Quar…

C++基礎算法————遞推

C++遞推:初學者的進階之旅 一、引言 在計算機編程的世界里,C++ 以其強大的功能和高效性受到眾多開發者的青睞。遞推作為一種重要的編程思想,在解決各種復雜問題時發揮著關鍵作用。對于初學者來說,理解并掌握遞推不僅可以提升編程能力,還能培養邏輯思維和問題解決能力。本…

QTabWidget垂直TabBar的圖標和文本水平顯示

一般情況下,我們可以通過QTabWidget的setTabPosition方法來設置TabBar的位置,比如設置在左邊 ui->tabWidget->setTabPosition(QTabWidget::West); 但是此時圖標和文字都是垂直的,如果讓它們水平顯示呢? 一.效果 二.原理 在繪制TabBar時,順時針旋轉90度 三.實現 …

HCIP-AI培養計劃,成為新時代AI解決方案架構高級工程師

01 華為認證是什么&#xff1f; 華為認證&#xff08;Huawei Certification&#xff09;是面向數字化時代構建的ICT人才培訓與認證體系。 當前超過68萬來自全球180多個國家和地區的各行業精英已經取得華為認證&#xff0c;如今全球每年超過10萬名學員通過考試獲得華為認證。 華…

【RabbitMQ】基于Spring Boot + RabbitMQ 完成應用通信

文章目錄 需求描述創建項目訂單系統(生產者)完善配置聲明隊列下單接口啟動服務 物流系統(消費者)完善配置監聽隊列啟動服務 格式化發送消息對象SimpleMessageConverter定義一個對象生產者代碼消費者運行程序 JSON定義一個對象生產者代碼定義轉換器消費者代碼運行程序 需求描述 …

OpenGL Chan視頻學習-7 Writing a Shader inOpenGL

bilibili視頻鏈接&#xff1a; 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 函數網站&#xff1a; docs.gl 說明&#xff1a; 1.之后就不再整理具體函數了&#xff0c;網站直接翻譯會更直觀也會…

Vue 3.0中復雜狀態如何管理

在現代前端應用中&#xff0c;狀態管理扮演著至關重要的角色。一個良好的狀態管理方案能夠&#xff1a; 1. 保持應用數據的一致性和可預測性&#xff1b; 2. 簡化組件間的通信和數據共享&#xff1b; 3. 提高代碼的可維護性和可測試性&#xff1b; 4. 優化應用性能&#xf…

AGI大模型(33):LangChain之Memory

大多數的 LLM 應用程序都會有一個會話接口,允許我們和 LLM 進行多輪的對話,并有一定的上下文記憶能力。但實際上,模型本身是不會記憶任何上下文的,只能依靠用戶本身的輸入去產生輸出。而實現這個記憶功能,就需要額外的模塊去保存我們和模型對話的上下文信息,然后在下一次…