Flask 請求數據獲取方法詳解

一、工作原理

在 Flask 中,所有客戶端請求的數據都通過全局的 request 對象訪問。該對象是 請求上下文 的一部分,僅在請求處理期間存在。Flask 在收到請求時自動創建 request 對象,并根據請求類型(如 GET、POST)和內容類型(如表單、JSON)解析數據,將不同來源的數據封裝到對應的屬性中(如 argsformjson)。

二、常用方法
  1. 查詢參數(URL參數)
    使用 request.args(類型:ImmutableMultiDict)獲取 URL 中的查詢參數。

    name = request.args.get('name')  # 獲取單個參數
    all_args = request.args.to_dict()  # 轉為字典
    
  2. 表單數據
    針對 application/x-www-form-urlencodedmultipart/form-data 類型的 POST 請求,使用 request.form

    username = request.form.get('username')
    
  3. JSON 數據
    當請求的 Content-Typeapplication/json 時,使用 request.json 直接獲取解析后的字典。

    data = request.json
    
  4. 文件上傳
    通過 request.files 獲取上傳的文件(類型:FileStorage)。

    file = request.files.get('file')
    if file:file.save('uploaded_file.txt')
    
  5. 原始數據
    使用 request.data 獲取未經處理的原始字節數據(如非表單、非JSON的請求體)。

  6. 請求頭與Cookies

    user_agent = request.headers.get('User-Agent')
    user_token = request.cookies.get('token')
    
三、高級用法
  1. 處理多值參數
    當參數有多個值時(如多選框),使用 getlist

    selected_ids = request.form.getlist('ids')
    
  2. 強制解析JSON
    即使 Content-Type 不是 application/json,也可強制解析:

    data = request.get_json(force=True)
    
  3. 流式處理大文件
    使用 request.stream 逐塊讀取數據,避免內存溢出:

    @app.route('/upload', methods=['POST'])
    def upload():def generate():chunk_size = 4096while True:chunk = request.stream.read(chunk_size)if not chunk:break# 處理chunk...return 'Upload complete'
    
  4. 混合數據(表單+JSON)
    使用 request.values 合并查詢參數和表單數據(不推薦混用,需謹慎處理邏輯)。

四、完整示例
from flask import Flask, request, jsonifyapp = Flask(__name__)@app.route('/api', methods=['GET', 'POST'])
def handle_request():# 獲取查詢參數query_param = request.args.get('q')# 根據不同請求類型處理數據if request.method == 'POST':# 處理表單數據username = request.form.get('username')# 處理JSON數據json_data = request.get_json(silent=True)  # 解析失敗返回None# 處理文件上傳uploaded_file = request.files.get('file')if uploaded_file:uploaded_file.save('uploads/' + uploaded_file.filename)return jsonify({"query_param": query_param,"username": username,"json_data": json_data,"file_uploaded": bool(uploaded_file)})else:return jsonify({"query_param": query_param})if __name__ == '__main__':app.run(debug=True)
五、注意事項
  1. 請求方法影響數據獲取

    • GET 請求只有 args,無 formfiles
    • POST 需根據 Content-Type 選擇正確的屬性(如 formjson)。
  2. 處理缺失數據
    使用 .get('key') 而非 ['key'] 避免 KeyError,可指定默認值:

    value = request.form.get('key', 'default')
    
  3. JSON解析安全

    • 使用 request.get_json(silent=True) 避免解析失敗拋出異常。
    • 使用 force=True 時需注意客戶端可能發送非法數據。
  4. 文件上傳安全

    • 限制文件類型和大小(通過 MAX_CONTENT_LENGTH 配置)。
    • 驗證文件名,避免路徑遍歷漏洞。
六、擴展知識
  1. 請求鉤子預處理
    使用 @app.before_request 在請求處理前統一驗證或預處理數據:

    @app.before_request
    def check_auth():if not request.endpoint == 'login' and not validate_token(request.headers.get('Token')):return jsonify({"error": "Unauthorized"}), 401
    
  2. 第三方庫擴展

    • Flask-RESTful:構建 REST API,自動解析請求數據。
    • Flask-WTF:集成 WTForms,處理表單驗證和CSRF保護。
  3. 性能優化

    • 對于大文件上傳,使用流式處理或分塊傳輸。
    • 啟用 gzip 壓縮減少數據傳輸量。
  4. 測試請求
    使用 Flask 測試客戶端模擬請求:

    with app.test_client() as client:response = client.post('/api', data={'username': 'test'}, headers={'Content-Type': 'multipart/form-data'})assert response.status_code == 200
    

七、錯誤處理與調試技巧
1. 優雅處理數據解析錯誤

在解析客戶端數據時,可能會遇到格式錯誤或非法內容,需合理捕獲異常:

@app.route('/parse-json', methods=['POST'])
def parse_json():try:data = request.get_json()if data is None:raise ValueError("Invalid JSON")# 處理數據...except ValueError as e:return jsonify({"error": str(e)}), 400

關鍵點

  • 使用 silent=True 時,即使解析失敗也不會拋出異常,但需手動檢查 data 是否為 None
  • 針對文件上傳錯誤,可檢查 request.files 是否存在且文件對象有效。

2. 調試請求數據的實用方法

在開發過程中,快速查看原始請求數據有助于定位問題:

@app.route('/debug', methods=['POST'])
def debug_endpoint():print("Headers:", request.headers)print("Raw Data:", request.data.decode('utf-8'))print("Form Data:", request.form)return "Debug information logged"

工具推薦

  • Postman:模擬復雜請求(如 multipart/form-data 或自定義 headers)。
  • curl 命令:快速測試 API 接口:
    curl -X POST http://localhost:5000/api -H "Content-Type: application/json" -d '{"key": "value"}'
    

八、安全加固策略
1. 防范常見攻擊
  • CSRF 保護:使用 Flask-WTF 擴展自動生成和驗證 CSRF Token:

    from flask_wtf.csrf import CSRFProtect
    csrf = CSRFProtect(app)
    

    在表單中添加隱藏字段:

    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
    
  • SQL 注入防護:始終使用 ORM(如 SQLAlchemy)或參數化查詢,避免拼接 SQL 字符串。

  • XSS 防護:對用戶輸入的內容進行轉義(Flask 模板默認自動轉義)。


2. 文件上傳安全實踐
  • 限制文件擴展名

    allowed_extensions = {'png', 'jpg', 'jpeg'}
    filename = uploaded_file.filename
    if '.' not in filename or filename.split('.')[-1].lower() not in allowed_extensions:return "Invalid file type", 400
    
  • 防止路徑遍歷:使用 secure_filename 處理文件名:

    from werkzeug.utils import secure_filename
    safe_filename = secure_filename(uploaded_file.filename)
    uploaded_file.save(f'uploads/{safe_filename}')
    

九、異步與性能優化
1. 異步處理大請求

使用 async/await 處理耗時操作(需 Flask 2.0+ 支持異步視圖):

@app.route('/async-upload', methods=['POST'])
async def async_upload():data = await request.get_data()# 異步處理數據(如寫入數據庫)return "Processing completed"

適用場景

  • 大文件上傳后的后臺處理(如視頻轉碼)。
  • 高并發下的非阻塞 IO 操作。

2. 性能調優建議
  • 配置請求體大小限制

    app.config['MAX_CONTENT_LENGTH'] = 100 * 1024 * 1024  # 限制為100MB
    
  • 啟用壓縮:通過 Nginx 或 GzipMiddleware 壓縮響應數據:

    from flask_compress import Compress
    Compress(app)
    

十、與其他技術棧集成
1. 結合前端框架處理數據
  • React/Vue 表單提交:確保前端 Content-Type 與后端匹配:

    // 使用FormData處理文件上傳
    const formData = new FormData();
    formData.append('file', fileInput.files[0]);
    fetch('/api/upload', { method: 'POST', body: formData });
    
  • AJAX 請求處理:Flask 自動解析 application/json,前端需明確設置 headers:

    fetch('/api/data', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({ key: 'value' })
    });
    

2. 擴展數據格式支持(如 XML)

若需解析 XML 請求,可自定義解析邏輯:

from xml.etree import ElementTree@app.route('/xml', methods=['POST'])
def parse_xml():xml_data = request.dataroot = ElementTree.fromstring(xml_data)value = root.find('key').textreturn jsonify({"value": value})

十一、實戰案例:構建RESTful API
1. 用戶注冊接口

處理混合數據(JSON + 文件頭像上傳):

@app.route('/register', methods=['POST'])
def register():# 解析JSON數據user_data = request.get_json()username = user_data.get('username')# 處理頭像文件avatar = request.files.get('avatar')if avatar:avatar.save(f'avatars/{secure_filename(avatar.filename)}')# 保存用戶到數據庫(偽代碼)save_user(username)return jsonify({"status": "success"})

2. 分頁查詢接口

結合查詢參數與數據過濾:

@app.route('/articles', methods=['GET'])
def get_articles():page = request.args.get('page', 1, type=int)per_page = request.args.get('per_page', 10, type=int)articles = Article.query.paginate(page=page, per_page=per_page)return jsonify({"data": [article.to_dict() for article in articles.items],"total_pages": articles.pages})

十二、總結

Flask 的請求數據獲取機制兼顧靈活性與簡潔性,開發者需根據實際場景選擇合適的方法:

  • 基礎場景:直接使用 request.argsrequest.formrequest.json
  • 復雜場景:結合流式處理、異步操作或第三方庫擴展功能。
  • 安全優先:始終驗證輸入、限制資源、防范常見攻擊。

通過合理設計數據流和錯誤處理機制,可以構建出高效、健壯的 Web 應用。

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

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

相關文章

隊列基礎和例題

基礎 #include <queue> #include <iostream>/*** 入隊*/ void Test01() {std::queue<int> q;q.push(1);q.push(2);q.push(3);q.push(4);q.push(777);std::cout << "隊列大小:" << q.size() << std::endl;std::cout << &q…

U-Mail郵件加速服務:全球鏈路加速,安全穩定收發

由于跨國網絡擁堵、帶寬不穩定等因素&#xff0c;導致海外用戶在使用企業郵箱收發郵件時&#xff0c;經常出現郵件收發不暢的問題。針對這種情況&#xff0c;U-Mail正式推出了郵件加速服務&#xff0c;U-Mail郵件加速服務依托全球優質加速鏈路和轉發集群服務器&#xff0c;為海…

從工作到娛樂:Codigger Desktop 讓桌面環境更智能

在數字化時代&#xff0c;我們的桌面環境幾乎成了第二個家。Codigger Desktop 就像是這個家的設計師&#xff0c;幫你打造一個既實用又舒適的數字空間。無論你是想放松娛樂&#xff0c;還是高效工作&#xff0c;Codigger Desktop 都能滿足你的需求。 想象一下&#xff0c;你有一…

用python進行OCR識別

原文鏈接&#xff1a;https://www.bilibili.com/opus/1036675560501149699 我擔心原作者刪除&#xff0c;所以重新拷貝了一遍 1.下載tesseract 鏈接&#xff1a;https://github.com/UB-Mannheim/tesseract/wiki 這里示例安裝最新版本 點擊下載tesseract安裝包 2.安裝tess…

區間和數量統計 之 前綴和+哈希表

文章目錄 1512.好數對的數目2845.統計趣味子數組的數目1371.每個元音包含偶數次的最長子字符串 區間和的數量統計是一類十分典型的問題&#xff1a;記錄左邊&#xff0c;枚舉右邊策略前置題目&#xff1a;統計nums[j]nums[i]的對數進階版本&#xff1a;統計子數組和%modulo k的…

PCB 制造流程分步指南

最近的一次PCB打板經歷&#xff0c;板廠工程人員告知絲印偏到焊盤上了&#xff0c;內部讓我評估是否可以繼續貼片。 于是發一期文章&#xff0c;介紹一下PCB制造流程。 PCB制造工藝 PCB設計獲得批準且制造商收到最終制造文件后&#xff0c;PCB制造或生產就開始了。此時&…

python實現簡單的UI交互

文章目錄 1. 基礎打印 覆蓋同一行2. 多行動畫效果3. 彩色文本&#xff08;Windows/macOS/Linux&#xff09;4. 輸入交互5. 異步輸入與非阻塞顯示6. 高級控制臺 UI 庫 可以通過控制臺打印實現簡單的「偽UI交互」&#xff0c;尤其適合展示進度、動態文本或輕量級狀態反饋。以下是…

AI與思維模型【77】——PDCA思維模型

一、定義 PDCA思維模型是一種用于持續改進和優化工作流程、項目實施以及問題解決的科學管理方法。它由四個英文字母組成&#xff0c;分別代表計劃&#xff08;Plan&#xff09;、執行&#xff08;Do&#xff09;、檢查&#xff08;Check&#xff09;和處理&#xff08;Act&…

10天學會嵌入式技術之51單片機-day-3

第九章 獨立按鍵 按鍵的作用相當于一個開關&#xff0c;按下時接通&#xff08;或斷開&#xff09;&#xff0c;松開后斷開&#xff08;或接通&#xff09;。實物圖、原理圖、封裝 9.2 需求描述 通過 SW1、SW2、SW3、SW4 四個獨立按鍵分別控制 LED1、LED2、LED3、LED4 的亮…

vite+vue2+elementui構建之 package.json

webpack版本太低&#xff0c;構建依賴太多&#xff0c;頭大。 各種查閱資料&#xff0c;弄了一份直通構建vite構建elementUi核心文件&#xff0c; 構建基于開源若依vue2vue3版本改造&#xff0c;感謝開源&#xff0c;感謝若依。 vitevue2elementui構建之 vite.config.js-CSD…

提升變電站運維效率:安科瑞無線測溫系統創新應用

一、引言 變電站作為電力系統的關鍵樞紐&#xff0c;承擔著變換電壓、分配電能以及控制電力流向等重要任務。在變電站的運行過程中&#xff0c;電氣設備的接點溫度監測至關重要。過熱問題可能由多種因素引發&#xff0c;如電阻過大、接頭質量欠佳、銜接不緊密、物理老化等&…

DMA的三種傳輸功能

①內存到內存 #include "dma.h" #include "stdio.h"#define BUF_SIZE 16uint32_t src_buf[BUF_SIZE] {0x00000000,0x11111111,0x22222222,0x33333333,0x44444444,0x55555555,0x66666666,0x77777777,0x88888888,0x99999999,0xAAAAAAAA,0xBBBBBBBB,0xCCCCCCC…

【MySQL】MySQL 表的增刪改查(CRUD)—— 下篇(內含聚合查詢、group by和having子句、聯合查詢、插入查詢結果)

目錄 1. 插入查詢結果 2 聚合查詢 &#xff08;行與行之間運算&#xff09; count 計算查詢結果的行數 sum 求和 avg 求平均值 max 最大值 min 最小值 【小結】 3. group by 子句 分組 where 條件 having 條件 4. 聯合查詢&#xff08;多表查詢&#xff09; 內連接…

“思考更長時間”而非“模型更大”是提升模型在復雜軟件工程任務中表現的有效途徑 | 學術研究系列

作者&#xff1a;明巍/臨城/水德 還在為部署動輒數百 GB 顯存的龐大模型而煩惱嗎&#xff1f;還在擔心私有代碼庫的安全和成本問題嗎&#xff1f;通義靈碼團隊最新研究《Thinking Longer, Not Larger: Enhancing Software Engineering Agents via Scaling Test-Time Compute》…

電腦屏幕錄制軟件Captura源碼編譯(Win10,VS2022)

屏幕錄像的意義&#xff1a; 教育教學方面 制作教學資源&#xff1a;教師可以通過錄制屏幕來制作教學視頻&#xff0c;演示軟件操作、講解復雜的知識點等。學生可以隨時觀看這些視頻&#xff0c;便于復習和鞏固知識&#xff0c;尤其對于一些抽象的概念或難以在課堂上一次性掌握…

記一次調用大華抓拍SDK并發優化

目錄 一、問題分析 二、解決思路 三、貼代碼 四、總結 一、問題分析 按慣例上問題&#xff1a; 設備告警采用高電平持續模式&#xff1a;一次開&#xff0c;不主動關就一直處于告警狀態。 并發時多個請求下發 setDVRAlarmOutConfig&#xff0c;導致狀態混亂。 “開 -&g…

Python圖像變清晰與銳化,調整對比度,高斯濾波除躁,卷積銳化,中值濾波鈍化,神經網絡變清晰

本次使用圖片來源于百度 import cv2 import time import numpy as np import pywtfrom PIL import Image, ImageEnhance#-i https://pypi.mirrors.ustc.edu.cn/simpledef super_resolution(input_path, output_path, model_path, scale4):# 初始化超分辨率模型sr cv2.dnn_su…

12個HPC教程匯總!從入門到實戰,覆蓋分子模擬/材料計算/生物信息分析等多個領域

在科學研究、工程仿真、人工智能和大數據分析等領域&#xff0c;高性能計算 (High Performance Computing, HPC) 正扮演著越來越重要的角色。它通過并行處理、大規模計算資源的整合&#xff0c;極大提升了計算效率&#xff0c;使原本耗時數日的任務能夠在數小時內完成。 隨著計…

使用Autocannon.js進行HTTP壓測

目錄 一、為什么選擇Autocannon&#xff1f; 二、五分鐘快速上手 1. 環境準備 2. 發起首個壓測 3. 解讀測試報告 三、高階場景實戰 場景1&#xff1a;POST請求壓測 場景2&#xff1a;階梯式壓力測試 場景3&#xff1a;編程式集成測試 四、結果深度分析指南 1. 延遲分…

pnpm install報錯:此系統上禁止運行腳本

依賴安裝 報錯信息&#xff1a; pnpm : 無法加載文件 C:\Users\XXX\AppData\Roaming\npm\pnpm.ps1&#xff0c;因為在此系統上禁止運行腳本。有關詳細信息&#xff0c;請參閱 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在位置 行:1 …