FastAPI并发用户状态未隔离:不同会话属性为何同步?
问题原因与解决方案
核心原因是你的AppState类大概率错误地使用了类属性而非实例属性来存储用户状态。类属性是所有类实例共享的,不管创建多少个AppState对象,修改类属性都会同步影响所有实例。
错误的AppState定义示例
如果你的AppState是这样写的,就会出现你遇到的问题:
class AppState: # 这是类属性,所有实例共享同一份数据 user_info = {} preferences = {}
为什么会出现交叉影响?
当两个不同user-id的请求创建各自的AppState()实例时,虽然session_store里存的是两个不同的对象,但它们内部的user_info、preferences等变量是绑定在AppState类上的,而非每个实例独立拥有。所以你修改其中一个实例的变量时,本质是修改了类的属性,另一个实例访问的也是同一个类属性,自然会看到变量同步出现。
修复方案
把需要每个用户独立存储的变量放到__init__方法中,用self.xxx定义为实例属性,确保每个AppState实例拥有独立的数据:
class AppState: def __init__(self): # 这是实例属性,每个实例各自独立 self.user_info = {} self.preferences = {}
这样修改后,不同user-id对应的AppState实例就会拥有完全独立的状态,修改其中一个不会影响另一个。
内容的提问来源于stack exchange,提问作者luanpo1234
相关产品推荐
相关产品推荐

