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

0x5*_*6FF 11 python httprequest starlette fastapi

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

@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
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 12

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

\n
from fastapi import FastAPI\n\napp = FastAPI()\n\n@app.post("/create")\nasync def create_dataframe():\n    # df = ...  # create the df here\n    app.state.df = df\n
Run Code Online (Sandbox Code Playgroud)\n

然后,在get_dataframe端点内,您可以像这样检索df

\n
@app.get("/get")\nasync def get_dataframe():\n    df = app.state.df\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
from fastapi import Request\n\n@app.get(\'/get\')\nasync def get_dataframe(request: Request):\n    df = request.app.state.df\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n