AttributeError: объект '_AppCtxGlobals' не имеет атрибута 'user' в Flask
Я пытаюсь изучить флягу, следуя Flask Mega Tutorial. В разделе часть 5 представление login() редактируется следующим образом:
@app.route('/login', methods = ['GET', 'POST'])
@oid.loginhandler
def login():
if g.user is not None and g.user.is_authenticated():
return redirect(url_for('index'))
form = LoginForm()
if form.validate_on_submit():
session['remember_me'] = form.remember_me.data
return oid.try_login(form.openid.data, ask_for = ['nickname', 'email'])
return render_template('login.html',
title = 'Sign In',
form = form,
providers = app.config['OPENID_PROVIDERS'])
Это, однако, дает мне AttributeError, из которого я буду вставлять StackTrace ниже. Это дает ошибку, часть которой я вставил точно из источника примеров. Я использую PeeWee вместо SQLAlchemy, но поскольку этот фрагмент кода ничего не делает с БД, я бы не знал, почему это будет связано.
Кто-нибудь знает, что я могу сделать здесь неправильно?
Traceback (most recent call last):
File "/Users/kramer65/dev/repos/microblog/flask/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/Users/kramer65/dev/repos/microblog/flask/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/Users/kramer65/dev/repos/microblog/flask/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Users/kramer65/dev/repos/microblog/flask/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/Users/kramer65/dev/repos/microblog/flask/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Users/kramer65/dev/repos/microblog/flask/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/Users/kramer65/dev/repos/microblog/flask/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/Users/kramer65/dev/repos/microblog/flask/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/kramer65/dev/repos/microblog/flask/lib/python2.7/site-packages/flask_openid.py", line 446, in decorated
return f(*args, **kwargs)
File "/Users/kramer65/dev/repos/microblog/app/views.py", line 31, in login
if g.user is not None and g.user.is_authenticated():
File "/Users/kramer65/dev/repos/microblog/flask/lib/python2.7/site-packages/werkzeug/local.py", line 338, in __getattr__
return getattr(self._get_current_object(), name)
AttributeError: '_AppCtxGlobals' object has no attribute 'user'
Ответы
Ответ 1
В этом же учебном пособии, немного ниже, объясняется, как устанавливается g.user
:
Глобальный g.user
Если вы обратили внимание, вы запомните, что в функции просмотра входа мы проверяем g.user
, чтобы определить, был ли пользователь уже зарегистрирован. Чтобы реализовать это, мы будем использовать событие before_request
из Flask. Любые функции, декорированные с помощью before_request
, будут выполняться перед функцией просмотра каждый раз, когда будет получен запрос. Итак, это подходящее место для настройки нашей переменной g.user
(файл app/views.py
):
@app.before_request
def before_request():
g.user = current_user
Это все, что нужно. Глобальный current_user
задается флажком-входом, поэтому мы просто поместили копию в объект g
, чтобы иметь лучший доступ к ней. При этом все запросы будут иметь доступ к зарегистрированному пользователю, даже внутри шаблонов.
В вашем коде отсутствует этот обработчик before_request
.