You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
An active Flask application context is always required to access session and engine, regardless of if an application was passed to the constructor. #508, 944
De manière général, l'utilisation de l'objet db de flask-sqlalchemy, n'est pas vraiment compatible avec l'utilisation de celery. La session flask-sqlalchemy étant créée puis fermée lors d'une requête HTTP : quand on crée une tâche celery, on sort du contexte de la requête (et de l'app), donc on ne peut pas fermer correctement la session (d'ou le problème de perf remarqué précédement).
Cet article propose une façon élégante de créer et de passer la session aux tâche celery : https://celery.school/sqlalchemy-session-celery-tasks
ça donnerait quelquechose comme ça dans le fichier geonature.utils.celery.py
Version
2.14.0
Description du bug
Les tâches lancées par celery lève l’exception suivante :
RuntimeError: Working outside of application context
, ce qui fait planter le module d'export et toutes les tâches asynchrones de GeoNature.Suite à ce problème de perf : #2717 , on tente de fermer la session à chaque fin de tâche celery ->https://github.com/PnX-SI/GeoNature/blob/master/backend/geonature/tasks/__init__.py#L9
Or quand on est dans une tâche celery on est plus dans "l'app context" de Flask.
Depuis la version 3.0.0 de Flask-SQLAlchemy, on ne peut plus fermer une session hors de l'app context : https://flask-sqlalchemy.palletsprojects.com/en/3.1.x/changes/#version-3-0-5 :
De manière général, l'utilisation de l'objet
db
de flask-sqlalchemy, n'est pas vraiment compatible avec l'utilisation de celery. La session flask-sqlalchemy étant créée puis fermée lors d'une requête HTTP : quand on crée une tâche celery, on sort du contexte de la requête (et de l'app), donc on ne peut pas fermer correctement la session (d'ou le problème de perf remarqué précédement).Cet article propose une façon élégante de créer et de passer la session aux tâche celery : https://celery.school/sqlalchemy-session-celery-tasks
ça donnerait quelquechose comme ça dans le fichier
geonature.utils.celery.py
les tâches devront ensuite utiliser la session ainsi :
Le problème reste maintenant de passer cette session à toute les fonctions utilisées par les tâches (
GenericQuery
,GenericTables
etc etc...Edit :
Il y a peut être la possibilité de pousser un app_context lors du lancement du worker : https://stackoverflow.com/questions/12044776/how-to-use-flask-sqlalchemy-in-a-celery-task
The text was updated successfully, but these errors were encountered: