PnX-SI / UsersHub-authentification-module

Module Flask d'authentification de UsersHub
GNU General Public License v3.0
5 stars 13 forks source link

Mise à jour et dysfonctionnement #104

Open MoulinZ opened 4 months ago

MoulinZ commented 4 months ago

Bonjour,

Je suis passé de UsersHub 2.4.2 à 2.4.3. J'ai maintenant une erreur sur une application tierce qui utilise pypnusershub pour gérer les inscriptions et renouvellement de mot passe : non autorisé. J'ai donc décidé d'upgrader ma version de pypnusershub de 2.0.0 à 2.1.5 et par conséquent les dépendances notamment le passage à Flask 3. Là j'ai un nouveau problème que je n'avais pas avant, qui est le suivant :

127.0.0.1 - - [29/May/2024 09:18:01] "POST /auth/login HTTP/1.1" 500 -
Traceback (most recent call last):
  File "/home/zacharie/dev/inscription/backend/venv/lib/python3.9/site-packages/flask/app.py", line 1498, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/zacharie/dev/inscription/backend/venv/lib/python3.9/site-packages/flask/app.py", line 1476, in wsgi_app
    response = self.handle_exception(e)
  File "/home/zacharie/dev/inscription/backend/venv/lib/python3.9/site-packages/flask_cors/extension.py", line 165, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "/home/zacharie/dev/inscription/backend/venv/lib/python3.9/site-packages/flask/app.py", line 1473, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/zacharie/dev/inscription/backend/venv/lib/python3.9/site-packages/flask/app.py", line 882, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/zacharie/dev/inscription/backend/venv/lib/python3.9/site-packages/flask_cors/extension.py", line 165, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "/home/zacharie/dev/inscription/backend/venv/lib/python3.9/site-packages/flask/app.py", line 880, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/zacharie/dev/inscription/backend/venv/lib/python3.9/site-packages/flask/app.py", line 865, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]
  File "/home/zacharie/dev/inscription/backend/venv/lib/python3.9/site-packages/pypnusershub/routes.py", line 124, in login
    app = db.session.get(models.Application, id_app)
  File "<string>", line 2, in get
  File "/home/zacharie/dev/inscription/backend/venv/lib/python3.9/site-packages/sqlalchemy/orm/session.py", line 2853, in get
    return self._get_impl(
  File "/home/zacharie/dev/inscription/backend/venv/lib/python3.9/site-packages/sqlalchemy/orm/session.py", line 2975, in _get_impl
    return db_load_fn(
  File "/home/zacharie/dev/inscription/backend/venv/lib/python3.9/site-packages/sqlalchemy/orm/loading.py", line 530, in load_on_pk_identity
    session.execute(
  File "/home/zacharie/dev/inscription/backend/venv/lib/python3.9/site-packages/sqlalchemy/orm/session.py", line 1705, in execute
    bind = self.get_bind(**bind_arguments)
  File "/home/zacharie/dev/inscription/backend/venv/lib/python3.9/site-packages/flask_sqlalchemy/session.py", line 53, in get_bind
    engines = self._db.engines
  File "/home/zacharie/dev/inscription/backend/venv/lib/python3.9/site-packages/flask_sqlalchemy/extension.py", line 642, in engines
    raise RuntimeError(
RuntimeError: The current Flask app is not registered with this 'SQLAlchemy' instance. Did you forget to call 'init_app', or did you create multiple 'SQLAlchemy' instances?

Je ne trouve pas comment le résoudre...

Mon fichier app.py :

import requests
import json

from flask import Flask, request, Response, render_template, redirect, current_app, g
from flask_cors import CORS
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow

from importlib import import_module

from config import Config

import flask_login
from flask_login import current_user

from pypnusershub.login_manager import login_manager

# from models import Bib_Organismes

app = Flask(__name__)
app.config.from_object(Config)

# importé depuis pypnusershub
login_manager.init_app(app)

# blueprint relié au module usershub-authentification
from pypnusershub import routes_register
app.register_blueprint(routes_register.bp, url_prefix='/pypn/register')

CORS(app, supports_credentials=True)

db = SQLAlchemy(app) 
ma = Marshmallow(app)

import routes
app.register_blueprint(routes.bp)

from pypnusershub.routes import routes
app.register_blueprint(routes, url_prefix='/auth')

Merci pour votre aide !

jacquesfize commented 4 months ago

Bonjour @MoulinZ,

Pour associer l'objet SQLAlchemy avec l'application Flask, il faut passer par la méthode init_app(application_flask) de l'object flask_sqlalchemy.SQLAlchemy (Voir documentation https://flask-sqlalchemy.palletsprojects.com/en/3.1.x/quickstart/#configure-the-extension)

Tu peux t'inspirer de : https://github.com/PnX-SI/UsersHub/blob/1b5b79f19fadb4688860b4219fbf58df4554547e/app/app.py#L68

MoulinZ commented 4 months ago

db est initialisé dans env.py : https://github.com/PnX-SI/UsersHub/blob/1b5b79f19fadb4688860b4219fbf58df4554547e/app/env.py#L10

donc ça revient à faire

db = SQLAlchemy()
db.init_app(app) 

Qui revient au même que de déclarer en une lignedb = SQLAlchemy(app) non ?

En tout cas j'ai essayé j'ai la même erreur.

MoulinZ commented 4 months ago

Les routes "maison" de mon backend fonctionnent sans problème. C'est bien les routes de pypnusershub qui renvoient cet erreur. Comme si pypnusershub créait lui aussi une instance flask.

jacquesfize commented 4 months ago

Est-ce que tu as essayé d'initialiser l'objet SQLAlchemy avant l'ajout des routes ?

MoulinZ commented 4 months ago

oui j'y ai pensé, mais pas de changement.

pypnusershub initialise déjà un objet SQLAlchemy ?

jacquesfize commented 4 months ago

En effet, oui ! Il faut lui indiquer le chemin vers l'objet db dans la variable d'environnement FLASK_SQLALCHEMY_DB :

https://github.com/PnX-SI/UsersHub-authentification-module/blob/63c8e2a6498315e66fa5f90bdd64ab6018e20d24/src/pypnusershub/env.py#L6-L10

Sinon, il crée une nouvelle instance de SQLAlchemy

MoulinZ commented 4 months ago

Pour l'instant ça n'a pas réglé mon problème. J'ai downgrade mon UsersHub pour que tout refonctionne.