You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于CLI参数实现FastAPI的依赖注入

实现FastAPI路由中基于CLI参数的依赖注入

要让Consort依赖注入类使用启动时传入的CLI参数a、b、c,可以通过以下方式调整代码:

核心思路

  1. 将CLI参数存入FastAPI应用的全局状态(app.state),让依赖类能访问到这些启动时参数
  2. 调整依赖注入逻辑,通过依赖函数实例化Consort,从全局状态中获取所需参数
  3. 修正路由定义的缺失问题(原代码未定义router实例)

修改后的完整代码

import sys
import charles, william, george, elizabeth
from fastapi import FastAPI, Depends, Request
from fastapi.routing import APIRouter

def arg_parse(args):
    # 替换为实际的CLI参数解析逻辑,此处为示例返回值
    return "cli_param_a", "cli_param_b", "cli_param_c"

class Consort:
    def __init__(self, a, b, c):
        self.x = a_stuff(a)
        self.y = b_stuff(b)
        self.z = c_stuff(c)

# 模拟业务处理函数,替换为你的实际逻辑
def a_stuff(val):
    return f"processed_{val}"
def b_stuff(val):
    return f"processed_{val}"
def c_stuff(val):
    return f"processed_{val}"

class King:
    def __init__(self, app: FastAPI, a, b, c):
        self.a = a
        self.b = b
        self.c = c
        self.router = APIRouter()
        # 绑定路由到实例方法
        self.router.post("/create")(self.create)
        self.router.post("/read")(self.read)
        self.router.post("/update")(self.update)
        self.router.post("/delete")(self.delete)
        # 将路由注册到FastAPI应用
        app.include_router(self.router)

    # 定义依赖函数,从全局状态获取参数实例化Consort
    def get_consort(self, request: Request):
        return Consort(request.app.state.a, request.app.state.b, request.app.state.c)

    async def create(self, consort=Depends(get_consort)):
        return charles.create()

    async def read(self, consort=Depends(get_consort)):
        return william.read()

    async def update(self, consort=Depends(get_consort)):
        return george.update()

    async def delete(self, consort=Depends(get_consort)):
        return elizabeth.delete()

def main(args):
    a, b, c = arg_parse(args)
    app = FastAPI()
    # 将CLI参数存入应用全局状态
    app.state.a = a
    app.state.b = b
    app.state.c = c
    # 初始化King类并注册路由
    service = King(app, a, b, c)
    # 启动uvicorn服务
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

if __name__ == "__main__":
    main(sys.argv)

关键说明

  • 全局状态存储:在main函数中把解析后的a、b、c存入app.state,确保整个应用生命周期内都能访问到这些启动参数
  • 依赖注入逻辑:通过get_consort依赖函数,从request.app.state中取出CLI参数,实例化Consort并注入到路由方法中
  • 路由注册:在King类初始化时创建APIRouter,绑定实例方法后注册到FastAPI应用,解决原代码中router未定义的问题

内容的提问来源于stack exchange,提问作者Henry Thornton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:35:28