fastapi: 第二章:用路由拆分程序文件
一,什么是路由?
什么是路由?
简单来说,路由就是“网址”和“处理函数”之间的对应关系。
举个例子:
当用户访问 http://localhost:8000/users/123 时,FastAPI需要知道应该调用哪个函数来处理这个请求
当用户访问 http://localhost:8000/products/456 时,又应该调用另一个函数
这个映射关系,就是路由。
二,为什么需要路由模块化?
有的初学者会把所有路由写在一个main.py文件里。
这在只有两三个接口时没问题,但一旦项目变大,这个文件会变得非常臃肿,难以维护。
例如:一个电商系统可能有:用户模块、商品模块、订单模块、购物车模块、支付模块...如果全部塞进一个文件,代码可能达到几千行。
无论是找代码还是改代码,都会非常痛苦。
模块化的好处:
每个模块独立一个文件,职责清晰
多人协作时不会产生代码冲突
方便复用和测试
便于实现API版本管理
曾经有两个新手同事把代码写在一个文件中,自己维护时定位功能模块非常麻烦
三,代码
# api/products.py
# api/products.py
from fastapi import APIRouter
router = APIRouter(prefix="/products", tags=["商品管理"])
@router.get("/all")
def get_all_products():
return [{"id": 1, "name": "手机"}, {"id": 2, "name": "电脑"}]
@router.get("/one/{product_id}")
def get_product(product_id: int):
return {"id": product_id, "name": f"商品{product_id}"}
# api/users.py
# api/users.py
from fastapi import APIRouter
# 创建路由器实例
# prefix:所有路由的统一前缀,避免重复写"/users"
# tags:在Swagger文档中分组显示
router = APIRouter(prefix="/users", tags=["用户管理"])
@router.get("/all")
def get_all_users():
"""获取所有用户"""
return [{"id": 1, "name": "张三"}, {"id": 2, "name": "李四"}]
@router.get("/one/{user_id}")
def get_user(user_id: int):
"""根据ID获取单个用户"""
return {"id": user_id, "name": f"用户{user_id}"}
main.py
# main.py
from fastapi import FastAPI
from api import users, products
# 创建FastAPI应用
app = FastAPI(title="我的API项目")
# 注册路由模块
app.include_router(users.router)
app.include_router(products.router)
四,测试 效果
运行:
$ uvicorn main:app --reload
访问接口:


浙公网安备 33010602011771号