繁体   English   中英

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

[英]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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM