[英]How to share variables between HTTP requests in FastAPI?
我想知道如何在 FastAPI 中的HTTP
请求之间共享变量的值? 例如,我有一个POST
请求,其中我获取了一些音频文件,然后我将它们的信息转换为 Pandas 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'] = new_df
(您可以稍后检索),或将您的变量声明为global
变量(如此处所述),或者最好将其存储在应用程序实例中。 例如:
app.state.new_df = new_df
在get-dataframe
dataframe 端点内检索new_df
为:
new_df = app.state.new_df
或者,如果app
实例在您正在使用的文件中不可用(假设您在子模块中定义了端点,与主模块分开,如此处所述),您可以从Request
对象中获取app
实例:
from fastAPI import Request
@app.get("/get-dataframe/")
async def get_dataframe(request: Request):
return request.app.state.new_df
否则,如果您需要在不同的客户端以及多个进程/工作者之间共享该变量/对象,这可能还需要对其进行读/写访问,您应该使用数据库存储,例如PostgreSQL
、 SQLite
、 MongoDB
等,或Key-Value
存储(缓存),例如Redis
、 Memcached
等。您可能还想看看这个答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.