FastAPI 学习之路(二十五)路径操作装饰器依赖项

有时,我们并不需要在路径操作函数中使用依赖项的返回值。或者说,有些依赖项不返回值。

但仍要执行或解析该依赖项。

对于这种情况,不必在声明路径操作函数的参数时使用 Depends,而是可以在路径操作装饰器中添加一个由 dependencies 组成的 list。

 我们看下,如何去实现。我们去校验下请求头中的token,请求的key。

from fastapi import FastAPI, Depends, Header, HTTPException
from typing import Optional

app = FastAPI()

fake_db_items = [{"city": "beijing"}, {"city": "shanghai"}, {"city": "guangzhou"}]

def verify_token(token: str = Header(...)):
    if token != "mrli_token":
        raise HTTPException(status_code=400, detail="token is invalid")


def verify_key(key: str = Header(...)):
    if key != "mrli_key":
        raise HTTPException(status_code=400, detail="key is invalid")
    return key


@app.get("/items", dependencies=[Depends(verify_token), Depends(verify_key)])
def read_items():
   return fake_db_items


if __name__ == '__main__':
    import uvicorn
    uvicorn.run("main:app", reload=True, debug=True)

我们看下结果如何。   &n

<think>首先,用户的问题是:“我想了解路径操作装饰器相关信息 请问路径操作装饰器介绍”,这翻译成英文是:“I want to know about path operation decorator information. Please introduce path operation decorator.” 根据系统级指令,我需要使用中文回答,因为指令5指定“使用中文回答”。指令还说“生成相关问题”,所以回答后需要添加相关问题。 用户提供了引用内容,我应该从中提取信息来构建回答。引用主要来自FastAPI文档和相关资源,涉及路径操作装饰器(path operation decorators)的概念。 关键点来自引用: - 引用1,2,4,5描述FastAPI中的路径操作装饰器,特别强调可选参数`dependencies`,它允许添加依赖项列表,例如`Depends()`函数。 - 引用3提到Flask框架中的装饰器,但用户问题是关于路径操作装饰器,结合上下文,用户可能更关注FastAPI的,因为引用中FastAPI占多数。 - 核心功能:路径操作装饰器FastAPI中用于定义路由和处理函数,类似于Flask的`@app.route()`。在FastAPI中,它支持`dependencies`参数,用于添加子依赖项,这些依赖项可以在请求处理前执行验证逻辑,如检查请求头。 - 示例:在FastAPI中,`@app.get("/items/", dependencies=[Depends(verify_token), Depends(verify_key)])`用于添加依赖项。这些依赖项如`verify_token`和`verify_key`函数检查请求头中的令牌和键,如果不匹配则抛出异常。 - 目的:这些依赖项用于执行预处理逻辑,如认证、验证,而不需要返回值传递给路径操作函数。 回答结构: 1. **引言**:简要介绍什么是路径操作装饰器。 2. **主要功能**:解释在FastAPI中如何使用,特别是`dependencies`参数。 3. **工作方式**:描述依赖项的执行顺序和作用。 4. **示例**:提供一个简单的代码示例来演示。 5. **引用**:自然地添加引用标识符到相关段落末尾。例如,基于提供的引用,使用[^1], [^2], etc.。 6. **相关问题**:结束时生成相关问题。 确保遵循指令: - 所有行内数学表达式用$...$格式,但这里没有数学内容。 - 独立公式用$$...$$格式,但不需要公式。 - LaTeX语法正确,但可能不适用。 - 中文回答。 - 生成相关问题。 相关问题生成:基于主题,如“路径操作装饰器的优势?”、“如何在FastAPI中自定义依赖项?”、“与其他框架如Flask的比较?”等。 构建回答大纲: - 开头:定义路径操作装饰器。 - 主体:详细解释在FastAPI中的实现,参考引用。 - 结尾:总结重要性。 - 相关问题:列出2-3个相关问题。 最终回答需要清晰、结构化。 </think>### 路径操作装饰器介绍 路径操作装饰器是Web框架(如FastAPI和Flask)中的核心特性,用于将特定的URL路径映射到相应的处理函数(也称为视图函数)。它通过装饰器语法(例如`@app.get()`或`@app.post()`)简化路由定义,使代码更简洁易读。在FastAPI中,路径操作装饰器不仅支持基本的HTTP方法(如GET、POST),还引入了高级功能如依赖项注入(dependencies),用于在请求处理前执行预处理逻辑(如认证、验证或资源管理),而无需返回值传递给主函数。这提升了代码的可重用性和安全性[^1][^5]。 #### 主要功能和工作方式 - **基本定义**:路径操作装饰器允许开发者为特定HTTP方法和路径注册处理函数。例如,FastAPI中的`@app.get("/items/")`表示处理GET请求到`/items/`路径的函数。 - **依赖项支持**:FastAPI通过`dependencies`可选参数扩展了这一功能。该参数接受一个由`Depends()`组成的列表,每个`Depends()`引用一个依赖项函数。这些依赖项路径操作函数执行前被调用: - **执行顺序**:依赖项按列表顺序依次执行。 - **作用**:依赖项通常用于验证请求头、参数或其他上下文(如令牌或密钥),并可抛出异常中断请求(例如验证失败时返回HTTP 400错误)。如果依赖项返回值,它不会传递给路径操作函数,仅用于触发逻辑[^2][^4]。 #### 优势和应用场景 - **优势**: - **模块化**:依赖项可复用,避免代码冗余(如多个路由共享相同的令牌验证逻辑)。 - **安全性**:通过前置验证(如检查请求头),防止无效请求进入主逻辑。 - **性能优化**:依赖项执行快速,不会影响响应时间。 - **典型应用场景**: - API认证(如验证OAuth令牌)。 - 权限检查(如确保用户有访问权限)。 - 日志记录或监控(如记录请求来源)[^1][^5]。 #### 代码示例 以下是一个FastAPI的简单示例,展示路径操作装饰器如何使用`dependencies`参数添加两个依赖项(验证令牌和密钥)。如果请求头中的`X-Token`或`X-Key`无效,会立即抛出异常;否则,继续执行主函数: ```python from fastapi import FastAPI, Depends, Header, HTTPException app = FastAPI() # 定义依赖项函数:验证令牌 async def verify_token(x_token: str = Header(...)): if x_token != "fake-super-secret-token": raise HTTPException(status_code=400, detail="X-Token header invalid") # 定义依赖项函数:验证密钥 async def verify_key(x_key: str = Header(...)): if x_key != "fake-super-secret-key": raise HTTPException(status_code=400, detail="X-Key header invalid") return x_key # 返回值不会被传递,仅用于内部逻辑 # 使用路径操作装饰器添加依赖项 @app.get("/items/", dependencies=[Depends(verify_token), Depends(verify_key)]) async def read_items(): return [{"item": "Foo"}, {"item": "Bar"}] # 主函数仅返回数据,依赖项已处理验证 ``` 在这个例子中,访问`/items/`路径前,会先执行`verify_token`和`verify_key`函数验证请求头。如果任一验证失败,请求被拒绝;否则,返回item列表[^4][^5]。 #### 与其他框架比较 - **FastAPI vs Flask**:FastAPI路径操作装饰器更强大,支持原生异步和依赖注入;而Flask的`@app.route()`仅处理基本路由,依赖项需手动实现(如使用before_request钩子)[^3]。 路径操作装饰器是现代Web框架的重要组成部分,尤其在构建RESTful API时,它简化了请求处理流程并提升了代码质量[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值