fastapi 路由批量自动导入简介
当我们的项目越来越庞大的情况,或者说是每个接口一个可能加了相关注释之后就占用很多的空间的时候,所有有些时候我们的会把不同的接口分布到不同模块下,然后进行统一加载管理,这种方式相对手动的导入路由的方式来说,主要好处的是,只要我新增一个对应的接口,都不需要进行手动的添加,每次程序自动检测模块自动的加载即可。
如下不同的接口分布图示:
批量模块导入实现
步骤1 模块下定义对应的当前模块路由APIRouter
每个模块下对应的__init__:
from fastapi import APIRouter
api_router = APIRouter(prefix="/api/v1/goods", tags=["商品兑换模块"])
api_router = APIRouter(prefix="/api/v1/user", tags=["用户信息模块"])
步骤2 模块下对应的接口则从自己所属的包下导入api_router
from rights.apis.v1.goods import api_router
# 描述和description会有冲突,所以只能有一个存在
@api_router.post("/exchange", summary='确定兑换或直充')
def exchange_goods(forms: ExchangeGoodsForm, background_tasks: BackgroundTasks):
·····
······
步骤3 模块api_router属性扫描方法定义
def setup_batch_scan_iter_api_router(app_or_api_router, model_path, key_attribute='router', include_packages=True, recursive=True, is_loger_route=True):
'''
批量加载路由
:param app_or_api_router: 是哪个对象需要进行包含路由,是app还是APIRouter
:param model_path: 扫描的API的模块目录
:param key_attribute: 扫描的api属性名
# :param include_packages: 是否包含__init__
:param recursive:是否递归扫描,
:param is_loger_route: 是否给扫描出来的模块动态添加自定义的路由ContextLogerRoute类
:return:
'''
modules = find_modules(model_path, include_packages=include_packages, recursive=recursive)
try:
for name in modules:
module = import_string2(name)
if hasattr(module, key_attribute):
router = getattr(module, key_attribute)
if is_loger_route:
# 嵌套蓝图模块导入的时候,这里会失效,需要在蓝图模块手动的进行添加
# router.route_class = ContextLogerRoute
setattr(router, 'route_class', ContextLogerRoute) # 则添加属性到对象中
app_or_api_router.include_router(router)
except Exception as e:
print('导入时候,出现异常!检测是否存在表单类型错误!',e)
pass
步骤4 模块api_router属性扫描调用
app.setup_batch_scan_iter_api_router(model_path='rights.apis', key_attribute='api_router', is_loger_route=True)
此时对应的所有的API都会自动的导入滴哟!哈哈!
总结
以上仅仅是个人结合自己的实际需求,做学习的实践笔记!如有笔误!欢迎批评指正!感谢各位大佬!
结尾
END
简书:www.jianshu.com/u/d6960089b…
公众号:微信搜【小儿来一壶枸杞酒泡茶】
小钟同学 | 文 【欢迎一起学习交流】| QQ:308711822