Accéder à la session Flask dans un middleware

Le problème exposé dans ce sujet a été résolu.

Hello,

Je développe une petite application web, servie par Flask. Dans cette application, j’ai le concept de "version", l’utilisateur fait ses modifications sur une certaine version. J’ai donc mis en place un <select> dans la barre de navigation de mon site par lequel il peut choisir sur quelle version il travaille.

Voilà pour le contexte. Il me faut cependant un moyen pour m’assurer qu’une version est toujours présente à partir du moment où l’utilisateur est authentifié, j’ai donc pensé à utiliser un middleware:

class VersionSessionMiddleware:
    def __init__(self, app):
        self.app = app
        
    def __call__(self, environ, start_response):
        if not constants.SESSION_VERSION_NAME in session:
            session[constants.SESSION_VERSION_NAME] = constants.DEFAULT_VERSION
        return self.app(environ, start_response)

Sauf que l’application plante en beauté :

RuntimeError: Working outside of request context

De plus, je voudrais définir une version que si l’utilisateur est authentifié sauf que current_user me retourne None dans le middleware.

Je me doute bien que ce n’est pas un middleware que je dois utiliser ici, quel outil serait le mieux adapté pour mon cas (i.e. s’assurer qu’une version est bien définie dans la session lorsque l’utilisateur est connecté, à n’importe quelle requête) ?

Merci et bonne journée.

Salut,

J’ai un peu de mal à comprendre quelle forme prend la version. Tu parles de sélectionner la version et de vérifier qu’elle est toujours disponible, tu as donc un mécanisme pour gérer des versions en parallèle ? Car dans ton code je vois juste une condition sur une version unique.

Si par middleware tu parles de ceci je pense en effet que ce n’est pas adapté car ça se place autour de Flask (entre la couche wsgi et flask) et non dedans.
Par contre tu as d’autres mécanismes comme app.before_request pour interférer dans les requêtes :

from flask import Flask, session, Request

app = Flask(__name__)
app.secret_key = 'ZDS <3'

@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"

@app.before_request
def check_version():
    if 'VERSION' not in session:
        session['VERSION'] = 2
    print(session)

PS : if xxx not in container est généralement recommandé plutôt que if not xxx in container car considéré comme plus lisible (on identifie mieux l’opérateur).

En effet désolé si je n’étais pas clair.

Oui il y a bien toute une gestion de version (créer, modifier…) à côté. Le code que je présente est si aucune version n’est définie alors on l’ajoute à la session (car normalement c’est ajouté à la session au login de l’utilisateur mais comme il a la possibilité de retenir son auth, la version peut ne pas être présente).

Mais tu as bien résolu mon problème, c’est parfait, je te remercie !

PS : if xxx not in container est généralement recommandé plutôt que if not xxx in container car considéré comme plus lisible (on identifie mieux l’opérateur).

Le pire c’est que je le sais et que j’y fait attention… Merci pour la correction !

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte