Flask 和 FastAPI 接口定义对比入门
文章目录
- Flask 和 FastAPI 接口定义对比入门
- 一、先说结论:它们的目标一样,但风格不同
- 二、最简单的接口定义对比
- 三、Flask 的接口定义怎么理解
- 四、FastAPI 的接口定义怎么理解
- 五、两者在路由定义上的核心区别
- 六、路径参数的定义区别
- 七、查询参数的获取区别
- 八、POST 请求接收 JSON 的区别
- 九、参数校验上的差别非常明显
- 十、返回 JSON 的方式也有点不同
- 十一、模块化组织接口:Blueprint 和 APIRouter
- 十二、Flask 的 Blueprint 和 FastAPI 的 APIRouter 对比
- 十三、为什么很多人说 FastAPI 更适合写接口
- 十四、那 Flask 的优势是什么
- 十五、给初学者的一个理解方式
- 十六、一个完整的对比例子
- 十七、最适合初学者记住的几个对应关系
- 十八、初学者应该先学 Flask 还是 FastAPI
- 十九、总结
- 二十、写在最后
Flask 和 FastAPI 接口定义对比入门
对于很多刚开始学 Python Web 开发的人来说,常常会遇到两个热门框架:Flask 和 FastAPI。
它们都可以用来写后端接口,但在真正开始写代码时,很多人会发现:
- 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
这里的 1、2 就是路径参数。
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: int、name: 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 中一些相似概念这样记:
| Flask | FastAPI | 含义 |
|---|---|---|
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 请求体 |
Blueprint | APIRouter | 路由分组 |
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 时,你会发现很多概念其实是相通的,只是表达方式更现代了。
更多推荐
所有评论(0)