使用FastAPI搭建了一个python服务端项目里,在route的请求处理方法中使用depends来判断用户的登录状态。遇到了depends中的类变量导致跨请求会话传递数据的问题。本文地址:http://www.04007.cn/article/1183.html,未经许可,不得转载.
依赖项是FastAPI 提供的简单易用、功能强大的依赖注入系统。可以让开发人员轻松地把组件集成至 FastAPI。依赖注入非常适合共享业务逻辑、共享数据库连接、实现安全、验证、角色权限等场景,这些场景能复用相同的代码逻辑,而使用依赖注入,将代码重复最小化。依赖项可以是一个函数,也可以是一个类,官方的一个使用类做depends的示例如下:本文地址:http://www.04007.cn/article/1183.html,未经许可,不得转载.
from fastapi import Depends, FastAPI app = FastAPI() fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}] class CommonQueryParams: def __init__(self, q: str | None = None, skip: int = 0, limit: int = 100): self.q = q self.skip = skip self.limit = limit @app.get("/items/") async def read_items(commons: CommonQueryParams = Depends(CommonQueryParams)): response = {} if commons.q: response.update({"q": commons.q}) items = fake_items_db[commons.skip : commons.skip + commons.limit] response.update({"items": items}) return response之前的项目中我使用过函数作为depends,有些不足,这次我用的类。在上面的例子中FastAPI 调用 CommonQueryParams 类。这将创建该类的一个 "实例",该实例将作为参数 commons 被传递给你的函数。我这里是在route的请求处理方法中使用depends来判断用户的登录状态,如部分代码示意如下:本文地址:http://www.04007.cn/article/1183.html,未经许可,不得转载.
# 接口函数 @router.post("/userinfo", summary="用户信息接口") async def userinfo( auto_login: AutoLogin = Depends(AutoLogin) ) # AutoLogin类代码示意 class AutoLogin: user = {} def __init__(self, x_token: Optional[str] = Header(None), request: Request = None): # 判断header中的x_token的有效性, # 如有效则提取并保存user字典存至AutoLogin的user中。 AutoLogin.user = userAutoLogin是一个depends类,其中会判断header中的x_token的有效性,如有效则提取并保存user字典和相关token字典至AutoLogin的类变量user和token中。在应用中发现用户请求未带有x_token的情况下API返回了用户的token数据,调试排查发现存在这种情况,上次用户有一个请求中带了x_token,然而在其接下来的一次请求中没有带x_token的前提下API接口获取到了上次提交的x_token,即导致了跨请求跨会话的数据传递。因为上面的AutoLogin类中使用了类变量导致的,类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外,有些类似静态属性的作用,但各种语言的执行逻辑不一样会出现不同的结果,在有些语言中虽然是静态属性但只会在某次请求中共享,而python中这种类变量则能跨请求传递共享,导致问题。本文地址:http://www.04007.cn/article/1183.html,未经许可,不得转载.
因此碰到这样的问题,不要在AutoLogin类中定义类变量,而要在类方法中使用self.类名来创建实例变量。本文地址:http://www.04007.cn/article/1183.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/1183.html 未经许可,不得转载. 手机访问本页请扫描右下方二维码.
![]() |
![]() |
手机扫码直接打开本页面 |