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存储任意额外状态,请参阅此答案,了解如何在应用程序启动之前执行此操作。例如:
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\nRun Code Online (Sandbox Code Playgroud)\n然后,在get_dataframe端点内,您可以像这样检索df:
@app.get("/get")\nasync def get_dataframe():\n df = app.state.df\nRun Code Online (Sandbox Code Playgroud)\n或者,如果app实例在您正在工作的文件中不可用(假设您在子模块中定义了端点,与主模块分开,如此处所述),您可以app从Request对象获取实例:
from fastapi import Request\n\n@app.get(\'/get\')\nasync def get_dataframe(request: Request):\n df = request.app.state.df\nRun Code Online (Sandbox Code Playgroud)\n否则,如果您需要在不同客户端以及多个进程/工作人员之间共享PostgreSQL该变量/对象,这可能还需要对其进行读/写访问,那么您应该使用数据库存储,例如、SQLite、MongoDB等.,或Key-Value存储(缓存),例如Redis,等。您可能也Memcached想看看这个答案。
| 归档时间: |
|
| 查看次数: |
10228 次 |
| 最近记录: |