Python Flask shutdown event handler
Question:
I’m using Flask as a REST endpoint which adds an application request to a queue. The queue is then consumed by a second thread.
server.py
def get_application():
global app
app.debug = True
app.queue = client.Agent()
app.queue.start()
return app
@app.route("/api/v1/test/", methods=["POST"])
def test():
if request.method == "POST":
try:
#add the request parameters to queue
app.queue.add_to_queue(req)
except Exception:
return "All the parameters must be provided" , 400
return "", 200
return "Resource not found",404
client.py
class Agent(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.active = True
self.queue = Queue.Queue(0)
def run(self):
while self.active:
req = self.queue.get()
#do something
def add_to_queue(self,request):
self.queue.put(request)
Is there a shutdown event handler in flask so that I can cleanly shutdown the consumer thread whenever the flask app is shutdown (like when the apache service is restarted)?
Answers:
There is no app.stop()
if that is what you are looking for, however using module atexit
you can do something similar:
https://docs.python.org/2/library/atexit.html
Consider this:
import atexit
#defining function to run on shutdown
def close_running_threads():
for thread in the_threads:
thread.join()
print "Threads complete, ready to finish"
#Register the function to be called on exit
atexit.register(close_running_threads)
#start your process
app.run()
Also of note-atexit
will not be called if you force your server down using Ctrl-C.
For that there is another module- signal
.
from flask import request
BASE_URL = "http://127.0.0.1:5000"
SHUTDOWN = "/shutdown"
def shutdown_server():
func = request.environ.get('werkzeug.server.shutdown')
if func is None:
raise RuntimeError('Not running with the Werkzeug Server')
func()
@app.route(SHUTDOWN, methods=['POST'])
def shutdown():
shutdown_server()
return 'Server shutting down...'
There seems to be a way mentioned here :-
http://web.archive.org/web/20190706125149/http://flask.pocoo.org/snippets/67
I’m using Flask as a REST endpoint which adds an application request to a queue. The queue is then consumed by a second thread.
server.py
def get_application():
global app
app.debug = True
app.queue = client.Agent()
app.queue.start()
return app
@app.route("/api/v1/test/", methods=["POST"])
def test():
if request.method == "POST":
try:
#add the request parameters to queue
app.queue.add_to_queue(req)
except Exception:
return "All the parameters must be provided" , 400
return "", 200
return "Resource not found",404
client.py
class Agent(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.active = True
self.queue = Queue.Queue(0)
def run(self):
while self.active:
req = self.queue.get()
#do something
def add_to_queue(self,request):
self.queue.put(request)
Is there a shutdown event handler in flask so that I can cleanly shutdown the consumer thread whenever the flask app is shutdown (like when the apache service is restarted)?
There is no app.stop()
if that is what you are looking for, however using module atexit
you can do something similar:
https://docs.python.org/2/library/atexit.html
Consider this:
import atexit
#defining function to run on shutdown
def close_running_threads():
for thread in the_threads:
thread.join()
print "Threads complete, ready to finish"
#Register the function to be called on exit
atexit.register(close_running_threads)
#start your process
app.run()
Also of note-atexit
will not be called if you force your server down using Ctrl-C.
For that there is another module- signal
.
from flask import request
BASE_URL = "http://127.0.0.1:5000"
SHUTDOWN = "/shutdown"
def shutdown_server():
func = request.environ.get('werkzeug.server.shutdown')
if func is None:
raise RuntimeError('Not running with the Werkzeug Server')
func()
@app.route(SHUTDOWN, methods=['POST'])
def shutdown():
shutdown_server()
return 'Server shutting down...'
There seems to be a way mentioned here :-
http://web.archive.org/web/20190706125149/http://flask.pocoo.org/snippets/67