簡體   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