Ниже приведен минимальный рабочий пример того, что, как мне кажется, является моей ближайшей попыткой сделать это правильно, используя пользовательский объект с журналом декоратор — моя идея заключалась в том, чтобы просто присвоить результат объекту журнала как атрибут класса, а затем использовать другой метод для записи его на диск, но я не могу понять, как гарантировать, что эта функция будет вызвана after< /em> 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()
Подробнее здесь: https://stackoverflow.com/questions/712 ... e-response