Как получить доступ к атрибуту из объекта запроса Flask-SQLAlchemy в документе шаблона Jinja2?

После успешного входа я сохраняю объект user (из запроса) в словарь session.

Когда я пытаюсь получить доступ к атрибуту объекта в моем шаблоне Jinja, я получаю сообщение об ошибке.

Ниже приведены коды для затронутых частей:

Файл "views.py" Python:

session['in_session'] = True
session['active_user'] = user

Файл Jinja2 "base.html":

{% if session.in_session %}
    <li><a href="">Signed in as {{session.active_user.username|safe|title}}!</a></li>
{%endif%}    


EDIT-1:
Вот ошибка traceback:

TypeError

TypeError: не сериализуемый JSON Traceback (последний последний вызов)

File "/home/acetakwas/web_dev/flask/flask_venv/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__

return self.wsgi_app(environ, start_response)

File "/home/acetakwas/web_dev/flask/flask_venv/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app

response = self.make_response(self.handle_exception(e))

File "/home/acetakwas/web_dev/flask/flask_venv/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception

reraise(exc_type, exc_value, tb)

File "/home/acetakwas/web_dev/flask/flask_venv/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app

response = self.full_dispatch_request()

File "/home/acetakwas/web_dev/flask/flask_venv/lib/python2.7/site-packages/flask/app.py", line 1479, in full_dispatch_request

response = self.process_response(response)

File "/home/acetakwas/web_dev/flask/flask_venv/lib/python2.7/site-packages/flask/app.py", line 1693, in process_response

self.save_session(ctx.session, response)

File "/home/acetakwas/web_dev/flask/flask_venv/lib/python2.7/site-packages/flask/app.py", line 837, in save_session

return self.session_interface.save_session(self, session, response)

File "/home/acetakwas/web_dev/flask/flask_venv/lib/python2.7/site-packages/flask/sessions.py", line 326, in save_session

val = self.get_signing_serializer(app).dumps(dict(session))

File "/home/acetakwas/web_dev/flask/flask_venv/lib/python2.7/site-packages/itsdangerous.py", line 537, in dumps

payload = want_bytes(self.dump_payload(obj))

File "/home/acetakwas/web_dev/flask/flask_venv/lib/python2.7/site-packages/itsdangerous.py", line 809, in dump_payload

json = super(URLSafeSerializerMixin, self).dump_payload(obj)

File "/home/acetakwas/web_dev/flask/flask_venv/lib/python2.7/site-packages/itsdangerous.py", line 522, in dump_payload

return want_bytes(self.serializer.dumps(obj))

File "/home/acetakwas/web_dev/flask/flask_venv/lib/python2.7/site-packages/flask/sessions.py", line 85, in dumps

return json.dumps(_tag(value), separators=(',', ':'))

File "/home/acetakwas/web_dev/flask/flask_venv/lib/python2.7/site-packages/flask/json.py", line 126, in dumps

rv = _json.dumps(obj, **kwargs)

File "/usr/lib/python2.7/json/__init__.py", line 250, in dumps

sort_keys=sort_keys, **kw).encode(obj)

File "/usr/lib/python2.7/json/encoder.py", line 209, in encode

chunks = list(chunks)

File "/usr/lib/python2.7/json/encoder.py", line 434, in _iterencode

for chunk in _iterencode_dict(o, _current_indent_level):

File "/usr/lib/python2.7/json/encoder.py", line 408, in _iterencode_dict

for chunk in chunks:

File "/usr/lib/python2.7/json/encoder.py", line 442, in _iterencode

o = _default(o)

File "/home/acetakwas/web_dev/flask/flask_venv/lib/python2.7/site-packages/flask/json.py", line 83, in default

return _json.JSONEncoder.default(self, o)

File "/usr/lib/python2.7/json/encoder.py", line 184, in default

raise TypeError(repr(o) + " is not JSON serializable")

TypeError: <User 2: u'tak'; u'[email protected]'> is not JSON serializable


EDIT-2:
Я только что понял, что проблема связана с сохранением объекта user, возвращаемого из моего запроса, в качестве словарного значения. Итак, если у меня есть класс User, который расширяет Model (из библиотеки SQLAlchemy), сделать что-то вроде этого не удастся:

session['active_user'] = User.query.filter_by(username='my_user_name').first()

Почему?


person Tósìn Anímáṣahun    schedule 12.05.2015    source источник


Ответы (1)


Было бы полезно опубликовать ошибки, с которыми вы сталкиваетесь. Но если бы мне пришлось угадывать, вы сказали, что сеанс - это диктат. В вашем коде вы получаете доступ к сеансу как к объекту. Вы должны быть в состоянии просто сделать:

{{session['active_user'].username|safe|title}}
person Spencer    schedule 12.05.2015
comment
session['active_user'] и session.active_user в Jinja2 одно и то же. - person Blender; 12.05.2015
comment
Я этого не знал. Тем не менее, вы можете опубликовать свою ошибку? - person Spencer; 12.05.2015
comment
@ Спенсер Да, ты прав; Я должен был опубликовать ошибку. Я постараюсь обновить свой вопрос. Однако, поскольку я сейчас не на своем компьютере, я могу дать идею: объект запроса не сериализуем JSON. Ошибка примерно такая. - person Tósìn Anímáṣahun; 12.05.2015
comment
Ах. Вероятно, вы не выполняете запрос до того, как отправите его в представление. Я обновлю ответ. - person Spencer; 12.05.2015