Flask throwing 'working outside of request context' when starting sub thread Flask throwing 'working outside of request context' when starting sub thread python python

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'})