Cómo utilizar g.user global en matraz

Como entiendo la variable g en Flask, debería proporcionarme un lugar global para guardar datos, como retener 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 …

  

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?

g es un subproceso local y es por solicitud (consulte una nota sobre proxies ). 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 con el que se está ejecutando es que la session se reconstruye en cada solicitud (ya que se envía al cliente y el cliente nos la devuelve), mientras que el conjunto de datos en g solo está disponible mientras dure esta solicitud.

Lo más simple que puede hacer (¡tenga en cuenta que simple != secure – si necesita un vistazo seguro a Flask-Login ) es simplemente agregar la 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 

Corrección menor, el objeto g está vinculado al contexto de la aplicación ahora en lugar del contexto de solicitud.

“A partir de Flask 0.10, esto se almacena en el contexto de la aplicación y ya no está en el contexto de la solicitud, lo que significa que estará disponible si solo el contexto de la aplicación está vinculado y aún no es una solicitud”.

Intentaré deshacerme de los globales, pensar en sus aplicaciones como un conjunto de funciones que realizan tareas, cada función tiene entradas y salidas, y no debería tocar globales. Simplemente busque a su usuario y transfiéralo, hace que su código sea mucho más comprobable. Mejor aún: deshacerse de matraz, matraz promueve el uso de globales como

 from flask import request