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