【发布时间】:2015-05-12 17:35:34
【问题描述】:
成功登录后,我将 user 对象(来自查询)保存到 session 字典中。
当我尝试在我的 Jinja 模板中访问对象的属性时,我得到一个错误。
以下是受影响部分的代码:
Python“views.py”文件:
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'ace@tak.was'> is not JSON serializable
EDIT-2:
我刚刚发现问题在于将从我的查询返回的 user 对象存储为字典值。因此,假设我有一个扩展 Model 的 User 类(来自 SQLAlchemy 库),这样做会失败:
session['active_user'] = User.query.filter_by(username='my_user_name').first()
这是为什么呢?
【问题讨论】:
标签: python flask jinja2 flask-sqlalchemy