【发布时间】:2022-08-02 19:24:23
【问题描述】:
所以我正在开发我的第一个 REST API,如果我错过了一些基本的东西,请提前道歉。无论如何,我有一个函数从另一台服务器接收一个 json 请求,处理它(根据数据进行预测),然后返回另一个带有结果的 json。我想在服务器的本地磁盘上记录到此端点的所有请求及其结果,用于评估目的和重新训练模型。但是,为了尽量减少返回结果给用户的延迟,我想先返回响应数据,然后再写入本地磁盘。如何正确地做到这一点对我来说并不明显,因为 FastAPI 范式要求 POST 方法的结果是修饰函数的返回值,所以我想对数据做的任何事情都必须完成前它被退回。
下面是一个最小的工作示例,我认为这是我迄今为止最接近正确的尝试,使用带有 log 装饰器的自定义对象 - 我的想法是将结果作为类属性分配给日志对象,然后使用另一种方法将其写入磁盘,但我不知道如何确保调用该函数后get_data 每次。
import json
import uvicorn
from fastapi import FastAPI, Request
from functools import wraps
from pydantic import BaseModel
class Blob(BaseModel):
id: int
x: float
def crunch_numbers(data: Blob) -> dict:
# does some stuff
return {\'foo\': \'bar\'}
class PostResponseLogger:
def __init__(self) -> None:
self.post_result = None
def log(self, func, *args, **kwargs):
@wraps(func)
def func_to_log(*args, **kwargs):
post_result = func(*args, **kwargs)
self.post_result = post_result
# how can this be done outside of this function ???
self.write_data()
return post_result
return func_to_log
def write_data(self):
if self.post_result:
with open(\'output.json\', \'w\') as f:
json.dump(self.post_result, f)
def main():
app = FastAPI()
logger = PostResponseLogger()
@app.post(\'/get_data/\')
@logger.log
def get_data(input_json: dict, request: Request):
result = crunch_numbers(input_json)
return result
uvicorn.run(app=app)
if __name__ == \'__main__\':
main()
基本上,我的问题归结为:\“在PostResponseLogger 类中,有没有办法在每次调用self.log 后自动调用self.write_data?\”,但如果我完全使用了错误的方法,也欢迎任何其他建议:)
-
你可能想看看this answer。
-
我可能遗漏了一些东西,但我认为那里没有任何东西可以解决我的问题 - 据我所知,FastAPI 中间件仍然只能处理响应前退货
标签: python-3.x fastapi python-decorators