PnX-SI / Nomenclature-api-module

Flask module for Nomenclature API
GNU General Public License v3.0
3 stars 10 forks source link

Résolution des problèmes de connexions et de sessions #17

Closed TheoLechemia closed 5 years ago

TheoLechemia commented 5 years ago

Depuis le passage à Flask 1.x on avait de gros problème de sessions et de connexions à la BDD en développement. Le nombre de connexions à la base était trop important, ce qui causait un crash de l'appli: TimeoutError: QueuePool limit of size 5 overflow 10 reached, connection timed out, timeout 30 En investiguant, c'était un problème d'instance de "DB SQLAlchemy" entre les sous-modules. Chaque sous module (nomenclature, et authentification) créait sa connexion à la base. J'ai solutionné le problème en passant l'instance DB au sous-modules via la configuration de l'application mère (peut-être pas très commun, mais ça fonctionne).

Pour que le sous module fonctionne, l'instance de l'application mère doit donc passer une variable DB à sa configuration, qui pointe vers l'instance de connexion SQLAlchemy, crée une et une seule fois.

Exemple, dans GeoNature a l'interieur de l'app factory:

from geonature.utils.env import DB
def get_app():
    app = Flask(__name__)
    # Bind app to DB
    DB.init_app(app)
    # Bind DB to the config
    app.config['DB'] = DB

   # ... blueprint and submodule registration
   return app

Et dans le sous module, on récupère l'instance comme ceci DB = current_app.config['DB']

Il toujours possible d'utiliser le sous-module comme une application indépendante, dans ce cas, on utilise l'instance DB créée dans le ficher env.py, et on passe le paramètre USE_AS_SUBMODULE=Falsedans le fichier config.py

On utilise ensuite une instance différente de DB en fonction de la configuration

USE_AS_SUBMODULE = current_app.config.get('USE_AS_SUBMODULE', True)
if USE_AS_SUBMODULE:
    DB = current_app.config['DB']
else:
    DB = import_module('.env', 'pypnnomenclature').DB
gildeluermoz commented 5 years ago

Putôt que de créer le paramètre USE_AS_SUBMODULE, est-ce qu'il ne serait pas possible de rendre l'affaire totalement transparente en testant si une instance a été reçue ou pas. Si pas reçue, elle est créée.

TheoLechemia commented 5 years ago

En effet, c'est fait dans le commit précédent.

gildeluermoz commented 5 years ago

Cool ! Bien joué. Comme ça c'est transparent.