Comment utiliser g.utilisateur global dans le flacon
Ainsi que je comprends le g de la variable dans le Flacon, il devrait me fournir une place pour ranger des données, comme la tenue de l'utilisateur actuel après la connexion. Est-ce correct?
Je voudrais que mes de navigation pour afficher mon nom d'utilisateur, une fois connecté, à travers le site.
Mon point de vue contenir
from Flask import g #among other things
Lors de la connexion, je attribuer
user = User.query.filter_by(username = form.username.data).first()
if validate(user):
session['logged_in'] = True
g.user = user
Il ne semble pas que je puisse y accéder.g.de l'utilisateur. Au lieu de cela, lors de mon base.html le modèle est le suivant...
<ul class="nav">
{% if session['logged_in'] %}
<li class="inactive">logged in as {{ g.user.username }}</li>
{% endif %}
</ul>
J'obtiens l'erreur:
jinja2.exceptions.UndefinedError
UndefinedError: 'flask.ctx._RequestGlobals object' has no attribute 'user'
La connexion fonctionne bien. Ce qui me manque?
g.user
n'est pas spécifique à une session - si je comprends ce que vous essayez de le faire correctement, vous seriez probablement mieux de faire quelque chose commesession['user'] = user
à la place.- Oups! Bon, si elle n'est pas spécifique à la session, il semble que vous avez raison.
- Attendez, peut-il être vrai? Je suis à la recherche de la plus vaste en ligne tutoriel que j'ai trouvé: blog.miguelgrinberg.com/post/... et il utilise fréquemment le g variable pour des choses comme
g.user = current_user
. Est-ce réellement incorrect? - En fait, vous et @SeanVieira sont à droite et je suis totalement et irrémédiablement erronée - même les Fiole docs dire que j'ai tort. Désolé pour la peine. :/
Vous devez vous connecter pour publier un commentaire.
g
est un thread local et est par demande (Voir Une Note Sur Les Procurations). Lesession
est aussi un thread local, mais dans le contexte par défaut est conservé dans un MAC-signé cookie et envoyé au client.Le problème que vous rencontrez est que
session
est reconstruit à chaque demande (car il est envoyé au client, et le client l'envoie de nouveau à nous), tandis que l'ensemble de données surg
n'est disponible que pour la durée de vie de ce demande.La plus simple chose à faire (note
simple != secure
- si vous avez besoin de sécuriser prendre un coup d'oeil à Flacon De Connexion) est tout simplement ajouter l'ID de l'utilisateur de la session et de la charge de l'utilisateur sur chaque demande:session
- il simplement s'occupe de tout les coin de cas de la gestion des login / déconnexions, de forcer la ré-authentification si nécessaire, etc. Le potentiel de ces cas de coin de mal, c'est ce qui permet à votre application de sécurité.g
est sûr à utiliser, peu importe - il n'est pas construit à partir de données fournies par l'utilisateur et peut donc être considérée comme "sûre".session
est probablement un meilleur pari (tout simplement parce queg
est détruit à la fin de chaque demande, alors quesession
est conservé entre les demandes). Donc, en supposant queUser
pourrait être sérialisé, vous pouvez faire:if "user" not in session: # query database
et d'éviter les nombreux appels à la base de données (Un non amélioréeg
aurait besoin d'un DB d'appel sur chaque demande, car il est toujours construit de nouveau).g
est pas défini par la demande, mais par application de contexte. Cela fait une sacrée différence.g
est effectuée pour chaque requête (vous ne pouvez pas partager des valeurs dans les demandes surg
).Correction mineure, le g de l'objet est lié au contexte de l'application maintenant, au lieu de le contexte de la demande.
"En commençant par Flacon de 0,10 c'est stockée sur le contexte de l'application et non plus sur le contexte de la demande ce qui signifie qu'elle est disponible uniquement si le contexte de l'application est lié et n'est pas encore une demande."
Je voudrais essayer de se débarrasser de globals tous ensemble, pensez à vos applications comme un ensemble de fonctions qui effectuent des tâches, chaque fonction possède des entrées et des sorties, et ne doit pas toucher globals. Juste récupérer votre nom d'utilisateur et le passer autour, il rend votre code plus vérifiable. Mieux encore: se débarrasser de flacon, flacon favorise l'utilisation de variables globales telles que
Better yet: get rid of flask
-- wtf?