文章目录

Flask 和 FastAPI 接口定义对比入门

对于很多刚开始学 Python Web 开发的人来说,常常会遇到两个热门框架:FlaskFastAPI

它们都可以用来写后端接口,但在真正开始写代码时,很多人会发现:

  • Flask 和 FastAPI 都能定义接口
  • 但写法不太一样
  • 参数获取方式不一样
  • 路由组织方式也不一样

于是就会产生很多问题:

  • 它们定义接口的核心思路一样吗?
  • Flask 的 @app.route() 和 FastAPI 的 @app.get() 有什么区别?
  • Flask 的 Blueprint 和 FastAPI 的 APIRouter 是一回事吗?
  • 初学者应该如何理解它们?

这篇文章就从最基础的角度,带你把 Flask 和 FastAPI 的接口定义方式 做一个清晰对比。


一、先说结论:它们的目标一样,但风格不同

Flask 和 FastAPI 的共同目标都是:

把某个 URL 请求和某个 Python 函数绑定起来,让函数来处理请求并返回结果。

也就是说,不管是 Flask 还是 FastAPI,本质上都在做一件事:

“当用户访问某个路径时,由哪个函数来处理。”

但是它们的写法风格不同:

  • Flask 更偏基础、灵活、传统
  • FastAPI 更偏现代、面向 API、强调类型声明

你可以先简单记成:

  • Flask:自己组装得更多
  • FastAPI:框架帮你做得更多

二、最简单的接口定义对比

先看最基础的例子。

Flask 写法

from flask import Flask

app = Flask(__name__)

@app.route('/hello', methods=['GET'])
def hello():
    return {'msg': 'hello'}

FastAPI 写法

from fastapi import FastAPI

app = FastAPI()

@app.get('/hello')
def hello():
    return {'msg': 'hello'}

这两个例子做的事情完全一样:

  • 定义了一个 /hello 接口
  • 接收 GET 请求
  • 返回一个 JSON 数据

但写法上已经能看出区别。


三、Flask 的接口定义怎么理解

在 Flask 里,最常见的接口写法是:

@app.route('/路径', methods=['请求方式'])
def 函数名():
    return 返回结果

例如:

@app.route('/hello', methods=['GET'])
def hello():
    return 'hello flask'

这段代码的意思是:

  • 当客户端访问 /hello
  • 并且请求方式是 GET
  • Flask 就执行 hello() 这个函数
  • 然后把结果返回给客户端

所以 Flask 的思路是:

先定义路径,再通过 methods 指定请求方式。

也就是说,Flask 更喜欢统一用一个 route() 入口。


四、FastAPI 的接口定义怎么理解

FastAPI 的写法更直接:

@app.get('/hello')
def hello():
    return {'msg': 'hello'}

这段代码的意思也是一样的:

  • 当客户端访问 /hello
  • 并且是 GET 请求
  • 就执行 hello()

但 FastAPI 不再统一写成 route(..., methods=['GET']),而是直接按请求方式来写:

  • @app.get()
  • @app.post()
  • @app.put()
  • @app.delete()

所以 FastAPI 的思路是:

请求方式直接体现在装饰器名字上。

这也是很多人第一次看到 FastAPI 时,觉得它更直观的原因。


五、两者在路由定义上的核心区别

Flask

@app.route('/user', methods=['GET'])
def get_user():
    return '查询用户'

FastAPI

@app.get('/user')
def get_user():
    return {'msg': '查询用户'}

对比一下会发现:

Flask 更像

“我定义一个路由,然后告诉你这个路由支持什么请求方式。”

FastAPI 更像

“我直接定义一个 GET 接口。”

所以在阅读代码时:

  • Flask 要看 methods=[...]
  • FastAPI 看装饰器名字就知道是 GET 还是 POST

六、路径参数的定义区别

路径参数就是 URL 中会变化的部分。

比如:

  • /user/1
  • /user/2

这里的 12 就是路径参数。


Flask 中的路径参数

@app.route('/user/<int:user_id>')
def get_user(user_id):
    return {'user_id': user_id}

Flask 的特点是:

  • 路径参数直接写在路由字符串里
  • 类型也写在路由中

例如:

<int:user_id>

表示:

  • 参数名叫 user_id
  • 类型是 int

FastAPI 中的路径参数

@app.get('/user/{user_id}')
def get_user(user_id: int):
    return {'user_id': user_id}

FastAPI 的特点是:

  • 路径中用 {user_id} 表示参数
  • 类型写在函数参数里

例如:

user_id: int

这说明:

  • user_id 是整数
  • FastAPI 会自动做类型转换和校验

两者对比

Flask

类型更多写在路径字符串里

'/user/<int:user_id>'

FastAPI

类型更多写在函数签名里

def get_user(user_id: int)

这其实反映了两个框架不同的设计风格:

  • Flask 更偏“路由规则”
  • FastAPI 更偏“类型声明”

七、查询参数的获取区别

查询参数就是 URL 中 ? 后面的内容。

例如:

/search?keyword=python

这里的 keyword=python 就是查询参数。


Flask 获取查询参数

Flask 通常通过 request.args 获取:

from flask import Flask, request

app = Flask(__name__)

@app.route('/search', methods=['GET'])
def search():
    keyword = request.args.get('keyword')
    return {'keyword': keyword}

这里的特点是:

  • 需要导入 request
  • 通过 request.args.get() 手动取参数

FastAPI 获取查询参数

FastAPI 可以直接把它写成函数参数:

from fastapi import FastAPI

app = FastAPI()

@app.get('/search')
def search(keyword: str):
    return {'keyword': keyword}

访问:

/search?keyword=python

FastAPI 会自动把查询参数传给函数里的 keyword


两者对比

Flask

你需要自己从请求对象里取值

FastAPI

函数参数本身就是接口参数

所以对初学者来说,FastAPI 常常会更像:

“URL 参数直接映射成 Python 函数参数”

这会让代码读起来更自然。


八、POST 请求接收 JSON 的区别

接口开发中,经常需要前端发送 JSON 数据。

例如发送:

{
  "username": "tom",
  "password": "123456"
}

Flask 中接收 JSON

from flask import Flask, request

app = Flask(__name__)

@app.route('/login', methods=['POST'])
def login():
    data = request.get_json()
    username = data.get('username')
    password = data.get('password')
    return {'username': username}

Flask 的特点是:

  • 先通过 request.get_json() 获取整个 JSON
  • 再自己从字典里取字段

这是一种“手动处理”的方式。


FastAPI 中接收 JSON

FastAPI 更推荐使用数据模型:

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class LoginData(BaseModel):
    username: str
    password: str

@app.post('/login')
def login(data: LoginData):
    return {'username': data.username}

FastAPI 的特点是:

  • 先定义数据结构
  • 框架自动把请求 JSON 转换成对象
  • 字段类型自动校验

两者对比

Flask

你手动取 JSON,手动处理字段

FastAPI

你先声明数据结构,框架自动帮你解析和校验

这就是为什么很多人会说:

Flask 更灵活
FastAPI 更规范


九、参数校验上的差别非常明显

这一点是两者很重要的区别。


Flask 的参数校验

Flask 本身是轻量框架,它默认不会自动帮你做强校验。

例如:

@app.route('/user', methods=['POST'])
def create_user():
    data = request.get_json()
    age = data.get('age')

    if not isinstance(age, int):
        return {'error': 'age 必须是整数'}, 400

    return {'msg': 'success'}

很多时候你需要自己判断:

  • 参数有没有传
  • 类型对不对
  • 格式是否正确

FastAPI 的参数校验

FastAPI 会大量利用类型注解和 Pydantic。

from pydantic import BaseModel

class User(BaseModel):
    name: str
    age: int

如果客户端传:

{
  "name": "Tom",
  "age": "abc"
}

FastAPI 会自动报错,因为 age 应该是整数。

所以:

  • Flask:很多校验逻辑自己写
  • FastAPI:很多校验逻辑框架自动完成

十、返回 JSON 的方式也有点不同

Flask

Flask 里很多教程喜欢这样写:

from flask import jsonify

@app.route('/hello')
def hello():
    return jsonify({'msg': 'hello'})

当然有时也可以直接返回字典,但初学时最常见的是 jsonify()


FastAPI

FastAPI 通常直接返回字典就可以:

@app.get('/hello')
def hello():
    return {'msg': 'hello'}

FastAPI 会自动把它转换成 JSON 响应。

所以这一点上,FastAPI 会更省一步。


十一、模块化组织接口:Blueprint 和 APIRouter

当项目变大以后,我们不会把所有接口都写在一个文件里。

这时 Flask 和 FastAPI 都提供了“分组管理接口”的方式。


Flask:Blueprint

例如:

from flask import Blueprint

user_bp = Blueprint('user', __name__, url_prefix='/api/user')

@user_bp.route('/login')
def login():
    return '用户登录'

然后在主程序里注册:

app.register_blueprint(user_bp)

它的意思是:

  • 创建一个用户蓝图
  • 用户相关接口都放进去
  • 统一加 /api/user 前缀
  • 最后注册到 Flask 应用上

FastAPI:APIRouter

FastAPI 里有一个非常相似的东西,叫 APIRouter

from fastapi import APIRouter

router = APIRouter(prefix='/api/user')

@router.get('/login')
def login():
    return {'msg': '用户登录'}

然后在主程序中注册:

app.include_router(router)

它们的关系可以这样理解

Flask

Blueprint 是“路由分组容器”

FastAPI

APIRouter 也是“路由分组容器”

两者思路很接近:

  • 都是先把一组接口整理起来
  • 再统一注册到主应用
  • 都支持公共前缀

所以如果你已经理解了 Flask 的 Blueprint,再看 FastAPI 的 APIRouter,通常会比较容易接受。


十二、Flask 的 Blueprint 和 FastAPI 的 APIRouter 对比

Flask

from flask import Flask, Blueprint

app = Flask(__name__)

user_bp = Blueprint('user', __name__, url_prefix='/api/user')

@user_bp.route('/info', methods=['GET'])
def info():
    return '用户信息'

app.register_blueprint(user_bp)

FastAPI

from fastapi import FastAPI, APIRouter

app = FastAPI()

router = APIRouter(prefix='/api/user')

@router.get('/info')
def info():
    return {'msg': '用户信息'}

app.include_router(router)

可以看到,两者在“模块化组织接口”上的结构非常相似:

  • Flask:Blueprint + register_blueprint
  • FastAPI:APIRouter + include_router

十三、为什么很多人说 FastAPI 更适合写接口

从“接口定义”这个角度看,FastAPI 的优势通常体现在这几个地方:

1. 写法更直接

比如 GET、POST 一眼就能看出来,不用再看 methods=[]

2. 参数更自然

很多参数直接写在函数签名里,代码更清晰

3. 类型提示更强

user_id: intname: str 这种写法很明确

4. 自动校验更方便

请求数据不符合要求时,框架自动处理很多错误

5. 自动文档很强

FastAPI 很适合做前后端分离项目中的 API 服务


十四、那 Flask 的优势是什么

这并不意味着 Flask 就“过时”了。

Flask 的优点也很明显:

1. 它更容易帮助你理解底层概念

因为很多事情需要你手动处理,所以你更容易真正明白:

  • 请求是什么
  • 路由是什么
  • 参数是怎么来的
  • 返回值是怎么处理的

2. 它非常灵活

Flask 本身很轻,你可以按自己的方式组织项目

3. 它学习路径清晰

对于初学者,Flask 常常更适合建立 Web 开发基础认知

所以很多人会觉得:

学原理和打基础,用 Flask 很合适
做规范 API 项目,FastAPI 往往更高效


十五、给初学者的一个理解方式

你可以这样理解这两个框架。

Flask 像什么

Flask 更像是:

“我给你一些基础工具,你自己把接口搭起来。”

你会接触到更多细节,比如:

  • 手动获取请求参数
  • 手动处理 JSON
  • 手动做更多参数判断

这有利于理解原理。


FastAPI 像什么

FastAPI 更像是:

“你把接口需要什么说清楚,我帮你自动完成很多事情。”

你只要写清楚:

  • 这个接口是什么请求方式
  • 这个参数是什么类型
  • 这个请求体长什么样子

框架就会帮你做很多处理。


十六、一个完整的对比例子

下面用“用户登录接口”来做一次完整对比。


Flask 版本

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/login', methods=['POST'])
def login():
    data = request.get_json()
    username = data.get('username')
    password = data.get('password')

    if not username or not password:
        return jsonify({'error': '参数不完整'}), 400

    return jsonify({
        'msg': '登录成功',
        'username': username
    })

这个版本的特点是:

  • 自己获取 JSON
  • 自己取字段
  • 自己判断参数是否为空
  • 自己决定返回什么错误

FastAPI 版本

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class LoginData(BaseModel):
    username: str
    password: str

@app.post('/login')
def login(data: LoginData):
    return {
        'msg': '登录成功',
        'username': data.username
    }

这个版本的特点是:

  • 先声明请求体模型
  • 参数由框架自动解析
  • 类型由框架自动校验
  • 接口定义更加“声明式”

十七、最适合初学者记住的几个对应关系

你可以把 Flask 和 FastAPI 中一些相似概念这样记:

FlaskFastAPI含义
Flask(__name__)FastAPI()创建应用
@app.route(..., methods=['GET'])@app.get(...)定义 GET 接口
@app.route(..., methods=['POST'])@app.post(...)定义 POST 接口
request.args.get()函数参数获取查询参数
request.get_json()Pydantic 模型参数获取 JSON 请求体
BlueprintAPIRouter路由分组
register_blueprint()include_router()注册分组路由

这张表对初学者特别有帮助,因为它能帮你建立“概念对应关系”。


十八、初学者应该先学 Flask 还是 FastAPI

这个问题没有绝对答案,但可以这样看。

如果你现在最想搞懂接口底层概念

建议先学 Flask。

因为 Flask 更容易让你真正理解:

  • 路由是怎么绑定函数的
  • 请求参数是怎么读取的
  • 蓝图是怎么组织接口的

如果你已经有一点 Python 基础,想更快写 API

FastAPI 会更顺手。

因为它:

  • 写法现代
  • 类型清晰
  • 参数处理方便
  • 更适合前后端分离接口开发

最现实的建议

其实最好的顺序往往是:

先用 Flask 理解接口本质,再学 FastAPI 感受现代 API 开发方式。

这样你不会只会“照着写”,而是真正知道它们在干什么。


十九、总结

Flask 和 FastAPI 在接口定义上的核心目标是一样的:

把 URL 请求交给某个 Python 函数处理。

但它们的写法风格不同:

Flask 的特点

  • 常用 @app.route(..., methods=[...])
  • 参数获取更手动
  • 灵活、基础、适合理解原理

FastAPI 的特点

  • 常用 @app.get()@app.post()
  • 参数直接写在函数签名里
  • 类型注解强,自动校验强,适合 API 开发

在模块化组织接口方面,两者也有很强的对应关系:

  • Flask 用 Blueprint
  • FastAPI 用 APIRouter

所以你可以把它们理解成:

Flask 是“更基础的接口定义方式”
FastAPI 是“更现代的接口定义方式”


二十、写在最后

对于初学者来说,不要急着比较哪个“更好”,更重要的是先搞懂:

  • 路由是什么
  • 路径参数是什么
  • 查询参数是什么
  • 请求体是什么
  • 接口函数和 URL 是怎么关联的

只要这些底层概念清楚了,无论你学 Flask 还是 FastAPI,都会越学越顺。

而且当你从 Flask 再去看 FastAPI 时,你会发现很多概念其实是相通的,只是表达方式更现代了。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐