26 中间件与依赖注入之依赖注入的基本用法

在上一篇中,我们讨论了 FastAPI 中间件的概念与使用方法。这篇文章将重点介绍 FastAPI 中的依赖注入(Dependency Injection,DI),并讲解其基本用法。依赖注入是 FastAPI 的一个强大特性,能够帮助我们管理复杂的应用程序逻辑。

一、依赖注入的基本概念

在 FastAPI 中,依赖注入是一种在处理请求时将特定功能或数据注入到路由处理函数中的方法。这可以让你在多个路由中复用逻辑,提高代码的可维护性和清晰度。通过将一些逻辑提取到依赖项中,我们可以让路由处理函数更专注于其核心功能。

依赖项可以是简单的函数或类,都能被 FastAPI 自动解析并注入。

二、定义依赖项

1. 创建简单的依赖项

以下是一个简单的依赖项示例。我们将创建一个函数,它将返回一个字符串。当我们在路由处理函数中使用这个依赖项时,它将被注入到相应的函数中。

1
2
3
4
5
6
7
8
9
10
11
from fastapi import FastAPI, Depends

app = FastAPI()

# 定义一个简单的依赖项
def get_query_param(q: str = None):
return q

@app.get("/items/")
async def read_item(q: str = Depends(get_query_param)):
return {"q": q}

在上面的代码中,get_query_param 函数是一个依赖项,其参数 q 通过 FastAPI 的请求查询参数自动填充。当访问 /items/?q=example 时,返回的 JSON 将是 {"q": "example"}

2. 依赖项的参数

依赖项的参数可以有默认值,或者可以通过请求上下文自动填充。下面的示例定义了一个更复杂的依赖项,包括默认值和类型注解。

1
2
3
4
5
6
7
8
9
10
11
12
13
from fastapi import FastAPI, Depends, HTTPException

app = FastAPI()

# 定义一个依赖项,带有参数和异常处理
def verify_query_param(q: str):
if q != "allowed":
raise HTTPException(status_code=400, detail="Query param must be 'allowed'")
return q

@app.get("/secure-items/")
async def read_secure_item(q: str = Depends(verify_query_param)):
return {"q": q}

这里,如果用户请求的 q 参数不等于 "allowed",会抛出一个 400 错误。在这一点上,我们就实现了一个简单的参数验证。

三、依赖项的复用

依赖项可以被多个路由使用,极大地提升了代码复用性。我们可以将常用的依赖项提取到单独的函数中,供多个路由使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from fastapi import FastAPI, Depends

app = FastAPI()

# 创建依赖项
def get_query_param(q: str = None):
return q

@app.get("/items/")
async def read_item(q: str = Depends(get_query_param)):
return {"q": q}

@app.get("/another-items/")
async def read_another_item(q: str = Depends(get_query_param)):
return {"another_q": q}

在上述示例中,两个不同的路由都使用了同一个依赖项 get_query_param。无论是 /items/ 还是 /another-items/,都能复用这段代码。

四、使用类作为依赖项

除了函数,FastAPI 还支持将类用作依赖项。这通常用于需要状态或初始化的复杂依赖项。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from fastapi import FastAPI, Depends

app = FastAPI()

class QueryParam:
def __init__(self, q: str = None):
self.q = q

# 定义一个依赖项类
def get_query_param_class(q: str = None):
return QueryParam(q)

@app.get("/class-items/")
async def read_item(query_param: QueryParam = Depends(get_query_param_class)):
return {"q": query_param.q}

在这个例子中,我们定义了一个 QueryParam 类,并将其实例作为依赖项注入到路由处理函数中。这样,可以轻松扩展功能,保持代码的整洁性。

五、总结

依赖注入是 FastAPI 的一个重要特性,它允许我们轻松地重用逻辑、管理复杂性并增强代码的可读性。在本篇文章中,我们介绍了依赖项的基本用法,以及如何创建和使用依赖项。

在下一篇文章中,我们将继续探讨 全局依赖路径依赖,如何在 FastAPI 中灵活运用这些特性来构建更为复杂的应用逻辑。希望本篇教程能让你对 FastAPI 的依赖注入有一个基本的了解,并能在实际项目中灵活应用。

26 中间件与依赖注入之依赖注入的基本用法

https://zglg.work/python-fastapi-zero/26/

作者

IT教程网(郭震)

发布于

2024-08-17

更新于

2024-08-18

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论