如何在 FastAPI 中的 HTTP 请求之间共享变量?



如何在 FastAPI 中的HTTP请求之间共享变量的值?例如,我有一个POST请求,其中我获取了一些音频文件,然后将它们的信息转换为熊猫Dataframe。我想在GET请求中发送该Dataframe,但我无法访问GET请求范围内的Dataframe

@app.post(
path="/upload-audios/",
status_code=status.HTTP_200_OK
)
async def upload_audios(audios: list[UploadFile] = File(...)):
filenames = [audio.filename for audio in audios]
audio_data = [audio.file for audio in audios]
new_data = []
final_data = []
header = ["name", "file"]
for i in range(len(audios)):
new_data = [filenames[i], audio_data[i]]
final_data.append(new_data)
new_df = pd.DataFrame(final_data, columns=header)
return f"You have uploaded {len(audios)} audios which names are: {filenames}"
@app.get("/get-dataframe/")
async def get_dataframe():
pass

如果您需要对该变量的只读访问权限,和/或您不希望在读取它之前被其他请求修改(换句话说,您永远不会期望为多个客户端提供服务),并且您的应用程序不使用多个工作线程 - 因为每个工作线程都有自己的东西,变量和内存) - 您可以(如上面的评论中提到的@MatsLindh)声明字典, 例如,foo = {},在端点外部(换句话说,全局),并在端点内为其分配一个密钥,例如foo['pd'] = df,(稍后可以在另一个请求到达时检索),或者将您的变量声明为global(如此处所述),或者最好将变量存储在应用程序实例上,这允许您使用 GENERICapp.state属性存储任意额外状态 - 请参阅此答案,了解如何在应用程序之前执行此操作启动。例如:

from fastapi import FastAPI
app = FastAPI()
@app.post("/create")
async def create_dataframe():
# df = ...  # create the df here
app.state.df = df

然后,在get_dataframe终结点中,可以像这样检索df

@app.get("/get")
async def get_dataframe():
df = app.state.df

或者,如果app实例在您正在使用的文件中不可用(假设您在子模块中定义了端点,与主模块分开,如此处所述),您可以从Request对象获取app实例:

from fastapi import Request
@app.get('/get')
async def get_dataframe(request: Request):
df = request.app.state.df

否则,如果您需要在不同的客户端之间以及多个进程/工作线程之间共享该变量/对象,这可能还需要对它进行读/写访问,则应使用数据库存储,例如PostgreSQLSQLiteMongoDB等,或Key-Value存储(缓存),例如RedisMemcached、 等。您可能也想看看这个答案。

最新更新