example python flask jinja2 flask-login

python - example - Cómo usar g.user global en matraz



Como entiendo la variable g en Flask, debería proporcionarme un lugar global para almacenar datos como mantener al usuario actual después de iniciar sesión. ¿Es esto correcto?

Me gustaría que mi navegación muestre el nombre de mi usuario, una vez que haya iniciado sesión, en todo el sitio.

Mis opiniones contienen

from Flask import g #among other things

Durante el inicio de sesión, asigno

user = User.query.filter_by(username = form.username.data).first() if validate(user): session[''logged_in''] = True g.user = user

No parece que pueda acceder a g.user. En cambio, cuando mi plantilla base.html tiene lo siguiente ...

<ul class="nav"> {% if session[''logged_in''] %} <li class="inactive">logged in as {{ g.user.username }}</li> {% endif %} </ul>

Me sale el error:

jinja2.exceptions.UndefinedError UndefinedError: ''flask.ctx._RequestGlobals object'' has no attribute ''user''

El inicio de sesión de lo contrario funciona bien. ¿Qué me estoy perdiendo?


Trataría de deshacerme de todos los elementos globales, piense en sus aplicaciones como un conjunto de funciones que realizan tareas, cada función tiene entradas y salidas, y no debe tocar globales. Simplemente busque a su usuario y páselo, hace que su código sea mucho más comprobable. Mejor aún: deshazte del matraz, el matraz promueve el uso de globals como

from flask import request


g es un subproceso local y es por solicitud (ver una nota en Proxy ). La session también es un hilo local, pero en el contexto predeterminado se conserva en una cookie firmada por MAC y se envía al cliente.

El problema al que se está enfrentando es que la session se reconstruye en cada solicitud (ya que se envía al cliente y el cliente nos la envía de regreso), mientras que el conjunto de datos en g solo está disponible mientras dure esta solicitud.

La forma más simple de hacerlo (¡tenga en cuenta lo simple != secure ; si necesita seguridad, eche un vistazo a Flask-Login ) es simplemente agregar el ID del usuario a la sesión y cargar al usuario en cada solicitud:

@app.before_request def load_user(): if session["user_id"]: user = User.query.filter_by(username=session["user_id"]).first() else: user = {"name": "Guest"} # Make it better, use an anonymous User instead g.user = user