【问题标题】:How do I access an attribute from a Flask-SQLAlchemy Query object in a Jinja2 template document?如何从 Jinja2 模板文档中的 Flask-SQLAlchemy 查询对象访问属性?
【发布时间】: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 对象存储为字典值。因此,假设我有一个扩展 ModelUser 类(来自 SQLAlchemy 库),这样做会失败:

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

这是为什么呢?

【问题讨论】:

    标签: python flask jinja2 flask-sqlalchemy


    【解决方案1】:

    发布您遇到的错误会很有帮助。但如果我不得不猜测,你说 session 是一个字典。在您的代码中,您正在像访问对象一样访问会话。你应该能够简单地做到:

    {{session['active_user'].username|safe|title}}
    

    【讨论】:

    • session['active_user']session.active_user 在 Jinja2 中是一样的。
    • 我不知道。不过,你能发布你的错误吗?
    • @Spencer 是的,你是对的;我应该发布错误。我会尝试更新我的问题。但是,由于我目前不在电脑旁,我可以给出一个想法:“查询对象不是 JSON 可序列化的”。错误是这样的。
    • 啊。在将查询发送到视图之前,您可能没有执行查询。我会更新答案。
    猜你喜欢
    • 2014-10-29
    • 2019-03-29
    • 2012-05-01
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    相关资源
    最近更新 更多