python - emailfield - querying database mongoengine
Frasco que arroja ''trabajo fuera del contexto de solicitud'' cuando se inicia el subproceso (3)
Estoy tratando de iniciar un nuevo hilo en Python dentro de una aplicación Flask. Estoy haciendo un trabajo de fondo que se desencadena con la solicitud, pero no necesito esperar a que se realice el trabajo para responder a la solicitud.
¿Es posible establecer la solicitud del matraz en esta sub-amenaza a la solicitud que entró? Por lo que respecta a la razón, nuestra ACL en nuestras consultas a nuestro DB (mongoengine frente a mongoDB) depende del usuario de la solicitud (lo agarra del objeto de solicitud del matraz) para ver si tienen acceso a los objetos, y explota porque la solicitud es no disponible en el sub thread
Cualquier pensamiento sería muy apreciado.
Aquí hay un pseudo código de cómo lo estoy manejando ahora, pero no está funcionando.
@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):
from flask import request
request = req
# Do Expensive work
thread.start_new_thread(handle_sub_view, (request))
return "Thanks"
Desde la versión 0.10 hay una forma admitida de hacerlo: http://flask.pocoo.org/docs/api/#flask.copy_current_request_context
Si desea que los before_request
ejecuten, debe invocar a current_app.preprocess_request()
dentro de la función decorada.
Envuelva su código de hilo en un test_request_context
para que tenga acceso a los locales del contexto :
@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"
Editar : vale la pena señalar que el hilo tendrá un contexto diferente al de la solicitud original. Debe extraer datos de solicitud interesantes, como la ID de usuario, antes de generar el hilo. A continuación, puede tomar un objeto de usuario (diferente) en el sub thread utilizando la ID.
Puede copiar la información deseada y pasarla:
@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(data):
# Use the data in subprocess
data = request.get_json() # copy the data
thread.start_new_thread(handle_sub_view, data)
return "Thanks"