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.mzph.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 …