Как использовать глобальную в колбе g.user

Поскольку я понимаю переменную g в Flask, она должна предоставить мне глобальное место для хранения данных, таких как сохранение текущего пользователя после входа в систему. Это верно?

Я хотел бы, чтобы моя навигация отображала мое имя пользователя после входа в систему через сайт.

Мои взгляды содержат

from Flask import g #among other things 

Во время входа в систему я назначаю

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

Кажется, я не могу получить доступ к g.user. Вместо этого, когда мой шаблон base.html имеет следующее …

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

Я получаю сообщение об ошибке:

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

В противном случае логин работает нормально. Что мне не хватает?

3 Solutions collect form web for “Как использовать глобальную в колбе g.user”

g является потоком локальным и является для каждого запроса (см . примечание о прокси ). session также является потоком локальным, но в контексте по умолчанию сохраняется файл cookie с MAC-адресом и отправляется клиенту.

Проблема, с которой вы сталкиваетесь, заключается в том, что session перестраивается по каждому запросу (поскольку он отправляется клиенту, а клиент отправляет его нам), тогда как набор данных на g доступен только для времени жизни этого запроса.

Простейшая вещь (обратите внимание на simple != secure – если вам нужно безопасно взглянуть на Flask-Login ), просто добавьте идентификатор пользователя в сеанс и загрузите пользователя по каждому запросу:

 @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 

Небольшая коррекция, g-объект привязан к контексту приложения теперь вместо контекста запроса.

«Начиная с Flask 0.10 это сохраняется в контексте приложения и больше не используется в контексте запроса, что означает, что он становится доступным, если привязан только контекст приложения и еще не является запросом».

Я попытался бы избавиться от глобальных комбинаций, подумайте о своих приложениях как о наборе функций, которые выполняют задачи, каждая функция имеет входы и выходы и не должна касаться глобальных переменных. Просто принесите своего пользователя и передайте его, это сделает ваш код намного более проверяемым. Еще лучше: избавиться от фляги, продвигать колбу, используя глобальные переменные, такие как

 from flask import request 
  • Поддерживает ли PyCharm Jinja2?
  • Как вы сортируете список в Jinja2?
  • Условно присоедините список строк в Jinja
  • Изменение активного класса ссылки с помощью twitter bootstrap css в python / flask
  • JSON появляется как юникодные объекты в шаблоне Jinja2
  • Как вы включаете код фляжки / jinja2 внутри файла уценки?
  • jinja2: html escape-переменные
  • Google App Engine (DataStore) Связанный Entitydeletion
  • Python - лучший язык программирования в мире.