Flask throwing 'working outside of request context' when starting sub thread
Wrap your thread code in a test_request_context
so you have access to context locals:
@app.route('/my_endpoint', methods=['POST'])def my_endpoint_handler(): #do tracking in sub-thread so we don't hold up the page def handle_sub_view(req): with app.test_request_context(): from flask import request request = req # Do Expensive work thread.start_new_thread(handle_sub_view, (request)) return "Thanks"
Edit: it's worth pointing out that the thread will have a different context than the original request. You need to extract any interesting request data, such as the user ID, before spawning the thread. You can then grab a (different) user object in the sub-thread using the ID.
Since version 0.10 there is a supported way of doing this: http://flask.pocoo.org/docs/api/#flask.copy_current_request_context
If you want the before_request
hooks to run you must call current_app.preprocess_request()
inside of the decorated function.
As @runfalk pointed out, you'll need to use @copy_current_request_context
. Here's a working code snippet:
import threadingfrom flask import request, jsonify, copy_current_request_context@app.route('/foo')def get_foo(): @copy_current_request_context def foo_main(): # insert your code here print(request.url) threading.Thread(target=foo_main).start() return jsonify({'status': 'started'})