flask路由和fastapi的路由的差异

flask路有系统demo
 
 
 
 
这里为你提供一份包含 Flask(现代 2.x/3.x 规范)最核心场景的路由系统 Demo。
与 FastAPI 的 APIRouter 类似,Flask 推荐使用 蓝图(Blueprint) 来进行路由的模块化拆分,而不是全部写在 app.py 中。

📂 1. 创建子路由模块(使用蓝图 blueprints/user.py
这个片段展示了 Flask 路由系统中最核心的 4 种传参场景:路径参数、查询参数(GET)、JSON数据(POST) 以及传统的 HTML 表单/文件上传。
python
from flask import Blueprint, request, jsonify

# 💡 1. 创建一个蓝图对象,相当于 FastAPI 的 APIRouter
# 参数依次为:蓝图名称、导入名、URL统一前缀
user_bp = Blueprint('user', __name__, url_prefix='/users')

# 🚀 场景 A: GET 请求 + 路径参数(指定类型)
# 💡 示例 URL: GET http://127.0.0
@user_bp.route('/<int:user_id>', methods=['GET'])
def get_user(user_id):
    # 如果用户不存在,可以返回状态码
    if user_id != 1:
        return jsonify({"error": "User not found"}), 404
        
    return jsonify({"id": user_id, "username": "maliang", "role": "admin"})

# 🚀 场景 B: GET 请求 + URL 查询参数(问号后面的参数)
# 💡 示例 URL: GET http://127.0.0
@user_bp.route('', methods=['GET'])
def list_users():
    # 使用 request.args 获取问号后面的参数,并可设置默认值与强制类型转换
    page = request.args.get('page', default=1, type=int)
    size = request.args.get('size', default=10, type=int)
    
    return jsonify({
        "page": page,
        "size": size,
        "data": [{"id": 1, "username": "maliang"}]
    })

# 🚀 场景 C: POST 请求 + 接收前端 JSON 数据
# 💡 示例: POST http://127.0.0
@user_bp.route('', methods=['POST'])
def create_user():
    # 使用 request.get_json() 获取前端传来的 JSON 字典
    # silent=True 可以在前端没传 JSON 时返回 None 而不是直接报错崩溃
    data = request.get_json(silent=True) or {}
    
    username = data.get('username')
    age = data.get('age')
    
    if not username:
        return jsonify({"error": "用户名不能为空"}), 400
        
    return jsonify({"status": "created", "username": username, "age": age}), 201

# 🚀 场景 D: POST 请求 + 接收传统 HTML 表单与文件上传
@user_bp.route('/upload-avatar', methods=['POST'])
def upload_avatar():
    # request.form 获取表单中的普通文本字段
    description = request.form.get('description', '')
    
    # request.files 获取上传的文件对象
    file = request.files.get('avatar')
    if file:
        # file.save(f"./uploads/{file.filename}") # 实际开发中保存文件的操作
        return jsonify({"message": "上传成功", "filename": file.filename, "desc": description})
        
    return jsonify({"error": "没有检测到上传的文件"}), 400
请谨慎使用此类代码。

🔌 2. 在主应用中注册蓝图 (app.py)
编写好蓝图路由后,在你的主入口文件中将其导入并注册到 app 实例上即可:
python
from flask import Flask, jsonify
# 💡 引入刚才编写的蓝图
from blueprints.user import user_bp

app = Flask(__name__)

# 💡 将蓝图注册到 Flask 应用中
app.register_blueprint(user_bp)

# 根路由
@app.route('/')
def index():
    return jsonify({"message": "欢迎来到 Flask 首页"})

# 💡 统一全局异常处理(可选,推荐)
@app.errorhandler(404)
def page_not_found(e):
    return jsonify({"error": "请求的接口不存在"}), 404

if __name__ == '__main__':
    # 启动本地开发服务器
    app.run(host='127.0.0.1', port=5000, debug=True)
请谨慎使用此类代码。

💡 Flask 与 FastAPI 路由的核心区别对照
功能场景FastAPI 写法Flask 现代写法
模块化划分 router = APIRouter() bp = Blueprint()
路径参数 @router.get("/{id}") @bp.route("/<int:id>")
查询参数 函数形参直接接收:page: int = 1 从全局对象获取:request.args.get('page')
JSON接收 Pydantic 类:data: Item 从全局对象获取:request.get_json()
返回 JSON 直接返回字典/模型 return {} 返回 jsonify({})(直接回传字典在2.0+也支持,但 jsonify 更安全)
这套基于蓝图(Blueprint)的 Flask 路由 Demo 可以完美应对你的多模块接口划分。请问你接下来的目标是:
  • 想要了解如何在这个 Flask 路由中拼装之前修好的 SQLAlchemy 2.0 同步数据库(get_db上下文)?
  • 还是需要引入例如 Flask-JWT-Extended 插件来实现路由接口的登录 Token 权限拦截?

posted on 2026-09-21 14:04  漫思  阅读(4)  评论(0)    收藏  举报

导航