Как зарегистрировать возвращаемое значение метода POST после возврата ответа? ⇐ Python
Как зарегистрировать возвращаемое значение метода POST после возврата ответа?
I'm working on my first ever REST API, so apologies in advance if I've missed something basic. I have a function that takes a JSON request from another server, processes it (makes a prediction based on the data), and returns another JSON with the results. I'd like to keep a log on the server's local disk of all requests to this endpoint along with their results, for evaluation purposes and for retraining the model. However, for the purposes of minimising the latency of returning the result to the user, I'd like to return the response data first, and then write it to the local disk. It's not obvious to me how to do this properly, as the FastAPI paradigm necessitates that the result of a POST method is the return value of the decorated function, so anything I want to do with the data has to be done before it is returned.
Below is a minimal working example of what I think is my closest attempt at getting it right so far, using a custom object with a log decorator - my idea was just to assign the result to the log object as a class attribute, then use another method to write it to disk, but I can't figure out how to make sure that that function gets called after get_data every time.
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() Basically, my question boils down to: "is there a way, in the PostResponseLogger class, to automatically call self.write_data after every call to self.log?", but if I'm using the wrong approach altogether, any other suggestions are also welcome.
Источник: https://stackoverflow.com/questions/712 ... e-response
I'm working on my first ever REST API, so apologies in advance if I've missed something basic. I have a function that takes a JSON request from another server, processes it (makes a prediction based on the data), and returns another JSON with the results. I'd like to keep a log on the server's local disk of all requests to this endpoint along with their results, for evaluation purposes and for retraining the model. However, for the purposes of minimising the latency of returning the result to the user, I'd like to return the response data first, and then write it to the local disk. It's not obvious to me how to do this properly, as the FastAPI paradigm necessitates that the result of a POST method is the return value of the decorated function, so anything I want to do with the data has to be done before it is returned.
Below is a minimal working example of what I think is my closest attempt at getting it right so far, using a custom object with a log decorator - my idea was just to assign the result to the log object as a class attribute, then use another method to write it to disk, but I can't figure out how to make sure that that function gets called after get_data every time.
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() Basically, my question boils down to: "is there a way, in the PostResponseLogger class, to automatically call self.write_data after every call to self.log?", but if I'm using the wrong approach altogether, any other suggestions are also welcome.
Источник: https://stackoverflow.com/questions/712 ... e-response
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как зарегистрировать возвращаемое значение метода POST после возврата ответа?
Anonymous » » в форуме Python - 0 Ответы
- 14 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как зарегистрировать вызывающего метода вместо метода, вызывающего Logger
Anonymous » » в форуме JAVA - 0 Ответы
- 36 Просмотры
-
Последнее сообщение Anonymous
-