Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mise à jour et dysfonctionnement #104

Open
MoulinZ opened this issue May 29, 2024 · 7 comments
Open

Mise à jour et dysfonctionnement #104

MoulinZ opened this issue May 29, 2024 · 7 comments

Comments

@MoulinZ
Copy link

MoulinZ commented May 29, 2024

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
Copy link
Contributor

jacquesfize commented May 29, 2024

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
Copy link
Author

MoulinZ commented May 29, 2024

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 ligne db = SQLAlchemy(app) non ?

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

@MoulinZ
Copy link
Author

MoulinZ commented May 29, 2024

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
Copy link
Contributor

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

@MoulinZ
Copy link
Author

MoulinZ commented May 29, 2024

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

pypnusershub initialise déjà un objet SQLAlchemy ?

@camillemonchicourt camillemonchicourt changed the title Mise à jour et disfonctionnement Mise à jour et dysfonctionnement May 29, 2024
@jacquesfize
Copy link
Contributor

jacquesfize commented May 29, 2024

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

db_path = environ.get("FLASK_SQLALCHEMY_DB")
if db_path:
db_module_name, db_object_name = db_path.rsplit(".", 1)
db_module = import_module(db_module_name)
db = getattr(db_module, db_object_name)

Sinon, il crée une nouvelle instance de SQLAlchemy

@MoulinZ
Copy link
Author

MoulinZ commented May 31, 2024

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants