PythonFlask传参案例实操?

wen python案例 1

《Python Flask传参案例实操:从基础到进阶的全面指南》

目录导读

  1. Flask传参的核心概念
  2. URL路径参数(动态路由)
  3. 查询字符串参数(GET请求)
  4. 表单数据参数(POST请求)
  5. JSON请求体参数(API开发)
  6. 文件上传参数处理
  7. 常见错误与最佳实践
  8. 问答环节

Flask传参的核心概念

在Flask Web开发中,参数传递是连接前端与后端的桥梁,不同于传统静态页面,Flask通过路由规则、请求对象和视图函数实现灵活的数据交互,理解传参机制,是构建高效RESTful API和动态网站的基础。

Python Flask传参的三种主要方式:

  • 路径参数:通过URL路径传递动态值
  • 查询参数:通过URL问号后传递键值对
  • 请求体参数:通过POST/PUT等方法传递表单或JSON数据

URL路径参数(动态路由)

这是Flask最具特色的传参方式,通过尖括号<variable>在路由中定义变量。

案例实操:用户个人主页

from flask import Flask
app = Flask(__name__)
@app.route('/user/<username>')
def show_user_profile(username):
    return f'用户 {username} 的个人主页'
@app.route('/post/<int:post_id>')
def show_post(post_id):
    return f'文章ID: {post_id} (类型: {type(post_id).__name__})'

关键点:

  • 默认参数类型为字符串
  • 支持显式类型转换:<int:var><float:var><path:var>
  • 使用<path:>可匹配包含斜杠的路径

问答:路径参数与查询参数的区别?

Q: 什么时候应该用路径参数而不是查询参数? A: 路径参数用于标识唯一资源(如:/user/123),而查询参数用于过滤或排序(如:/users?page=2),遵循RESTful原则,资源标识用路径,辅助操作用查询。


查询字符串参数(GET请求)

通过request.args对象获取URL中?key=value形式的参数。

案例实操:搜索引擎模拟

from flask import Flask, request
@app.route('/search')
def search():
    keyword = request.args.get('q', '默认关键词')
    page = request.args.get('page', 1, type=int)
    # 获取多个相同参数
    tags = request.args.getlist('tag')
    return f'搜索关键词: {keyword}, 页码: {page}, 标签: {tags}'

测试URL示例:

/search?q=Python&page=2&tag=web&tag=flask

最佳实践:

  • 始终提供默认值避免KeyError
  • 使用type=int进行类型转换
  • 处理多个同名参数用getlist()

表单数据参数(POST请求)

传统表单提交使用request.form获取数据,适合登录、注册等场景。

案例实操:用户登录

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']  # 无默认值,会引发400错误
        password = request.form.get('password', '')
        if username == 'admin' and password == 'secret':
            return '登录成功'
        return '用户名或密码错误'
    return '''
        <form method="post">
            <input type="text" name="username">
            <input type="password" name="password">
            <button type="submit">登录</button>
        </form>
    '''

安全注意:

  • 永远不要信任用户输入
  • 使用get()替代直接索引可避免异常
  • 对敏感数据考虑HTTPS加密

JSON请求体参数(API开发)

现代前后端分离项目通常使用JSON格式传递数据,通过request.get_json()获取。

案例实操:创建任务API

from flask import Flask, request, jsonify
@app.route('/api/tasks', methods=['POST'])
def create_task():
    # 方法一:获取整个JSON对象
    data = request.get_json()
    if not data:
        return jsonify({'error': '无效的JSON'}), 400
    = data.get('title')
    description = data.get('description', '')
    # 模拟保存到数据库
    return jsonify({
        'id': 1,
        'title': title,
        'description': description,
        'status': 'created'
    }), 201
@app.route('/api/tasks/<int:task_id>', methods=['PATCH'])
def update_task(task_id):
    data = request.get_json(force=True)  # 即使Content-Type不是application/json也解析
    # 实现部分更新...
    return jsonify({'updated': True})

常见JSON传参错误:

  • 忘记设置Content-Type: application/json
  • 使用request.json已弃用,推荐get_json()
  • 空请求体返回None时未处理

文件上传参数处理

利用Flask的request.files处理文件上传,适合头像、文档等场景。

案例实操:头像上传

import os
from flask import Flask, request, redirect, url_for
UPLOAD_FOLDER = './uploads'
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        if 'file' not in request.files:
            return '没有文件部分'
        file = request.files['file']
        if file.filename == '':
            return '未选择文件'
        if file and allowed_file(file.filename):
            filename = file.filename
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            return f'文件 {filename} 上传成功'
    return '''
        <form method="post" enctype="multipart/form-data">
            <input type="file" name="file">
            <input type="submit" value="上传">
        </form>
    '''

关键配置:

  • 必须设置enctype="multipart/form-data"
  • 检查文件扩展名防攻击
  • 使用secure_filename()处理文件名

常见错误与最佳实践

典型错误汇总

错误类型 现象 解决方案
参数缺失 KeyError 使用get()方法并提供默认值
类型错误 字符串对比数字 明确类型转换:int(request.args.get('id', 0))
编码问题 中文乱码 设置app.config['JSON_AS_ASCII'] = False
请求方法错误 405 Method Not Allowed 检查路由的methods参数

最佳实践清单

  1. 参数校验:使用Webargs、Marshmallow等库进行声明式验证
  2. 文档化:使用Flask-RESTx或Swagger自动生成API文档
  3. 错误处理:统一异常处理,返回结构化的错误JSON
  4. 安全性:对文件上传做大小和类型限制,使用参数化查询防SQL注入

问答环节

Q1: Flask如何获取URL中的可选参数?

A: 在路由中定义多个规则,或结合查询参数。

@app.route('/user/', defaults={'username': 'anonymous'})
@app.route('/user/<username>')
def user_profile(username):
    return f'用户: {username}'

当访问/user/时返回"用户: anonymous",访问/user/john时返回"用户: john"。

Q2: 处理大型JSON请求体时如何避免内存溢出?

A: 可使用流式处理:

from flask import stream_with_context
@app.route('/large-data', methods=['POST'])
def handle_large_request():
    chunk = request.stream.read(1024)  # 按块读取
    # 处理逻辑...

Q3: 如何同时接收JSON和表单参数?

A: 根据Content-Type判断:

if request.is_json:
    data = request.get_json()
else:
    data = request.form

注意:客户端必须明确设置Content-Type为application/json才能触发is_json为True。

Q4: 参数太多时如何保持代码整洁?

A: 推荐使用数据类或字典做参数封装:

from dataclasses import dataclass
@dataclass
class SearchParams:
    keyword: str
    page: int = 1
    size: int = 20
@app.route('/search')
def search():
    params = SearchParams(
        keyword=request.args.get('q', ''),
        page=request.args.get('page', 1, type=int)
    )
    # 使用params对象...

这样可以避免视图函数参数膨胀,也便于单元测试。


通过以上案例,你应该能够掌握Flask传参的核心技巧,从简单的路径参数到复杂的JSON API,灵活运用这些方法可以构建出优雅且健壮的Web应用,建议在实际项目中结合Postman或Swagger测试端点,加深对参数传递机制的理解。

标签: GET请求

抱歉,评论功能暂时关闭!