python - example - Cómo usar g.user global en matraz
login html python (3)
Corrección menor, el objeto g está ligado al contexto de la aplicación ahora en lugar del contexto de solicitud.
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