For one request alone i need to execute a function after sending the response to the client. Because the function takes time and that ends up in connection timeout Socket error: [Errno 32] Broken pipe
Is there a way in Flask to execute function after returning the request
Flask doesn't offer a solution to run functions in the background because this isn't Flask's responsibility. In most cases, the best way to solve this problem is to use a task queue such as RQ or Celery. These manage tricky things like configuration, scheduling, and distributing workers for you.
The logic that Flask applies to converting return values into response objects is as follows: If a response object of the correct type is returned it's directly returned from the view. If it's a string, a response object is created with that data and the default parameters.
The Flask response class, appropriately called Response , is rarely used directly by Flask applications. Instead, Flask uses it internally as a container for the response data returned by application route functions, plus some additional information needed to create an HTTP response.
One of the design principles of Flask is that response objects are created and passed down a chain of potential callbacks that can modify them or replace them. When the request handling starts, there is no response object yet.
I will expose my solution.
You can use threads to compute anything after returned something in your function called by a flask route.
import time from threading import Thread from flask import request, Flask app = Flask(__name__) class Compute(Thread): def __init__(self, request): Thread.__init__(self) self.request = request def run(self): print("start") time.sleep(5) print(self.request) print("done") @app.route('/myfunc', methods=["GET", "POST"]) def myfunc(): thread_a = Compute(request.__copy__()) thread_a.start() return "Processing in background", 200
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With