Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Need to execute a function after returning the response in Flask

Tags:

python

flask

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

like image 478
naga4ce Avatar asked Aug 06 '13 14:08

naga4ce


People also ask

How do you run a function in Flask?

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.

How do you return a function in Flask?

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.

What does Flask response do?

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.

What is callback in Flask?

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.


1 Answers

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 
like image 119
Alekos Avatar answered Oct 01 '22 23:10

Alekos