referencefield emailfield python flask mongoengine

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"



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"