【问题标题】:How to return a Python Object via Jinja2 back to Python?如何通过 Jinja2 将 Python 对象返回给 Python?
【发布时间】:2017-09-22 21:24:28
【问题描述】:

找不到与此问题相关的任何问题。我可能做错了,因为我确信一定有更简单的方法来实现这一点,但我还想不通。

--> 我正在尝试将一个 Python 对象从 Jinja2 获取回 Python,这样我就可以在 Python 中访问它的值。

所以我将一组用户从 Python(Flask) 传递到 HTML 中的下拉列表,如下所示:

<div class="form-group">
    <label>User:</label>
    <select class="form-control" name="user">
        {% for user in users %}
            <option value="{{ user }}">{{ user.firstname }} {{ user.lastname }} 
            ({{ user.birthdate }})</option>
        {% endfor %}
    </select>
</div>

这很好用,我可以在下拉列表中选择一个用户。现在我想在 Python 中访问用户 user.address 属性。 (当然这些属性已经在用户类中定义了)。

所以我在 Python (Flask) 中有一个这样的函数,当按下按钮时会触发它:

@app.route("/display_user", methods=["POST"])
def display_user():

    user = request.form["user"] 
    address = user.address
    return render_template("show.html", address=address)

现在我收到以下错误:

"AttributeError: 'str' object has no attribute 'address'".

我将 json 作为字符串取回,如下所示:

{'firstname': 'test','lastname': 'test','birthday': 'test','address': 'test'}

我现在可能应该用这个字符串/json 创建一个字典,然后用 ['address'] 访问这些值,但不知何故我不知道如何。我用 json.dumps() 尝试了它,但它不起作用,仍然是相同的错误消息。我还认为必须有一种更简单/更好的方法来实现这一目标。

有什么建议吗? (使用 Python 3.6.2)

【问题讨论】:

  • 那不是json,那是pythonrepr
  • 好的,我现在明白了。谢谢!有没有办法从 repr 回到该类的实例?还是让 Jinja2 返回用户的 instace/json?

标签: python json python-3.x flask jinja2


【解决方案1】:

好的,所以我最终得到了这个解决方案:

我只返回了 ._id 而不是整个用户实例,如下所示:

Jinja2/HTML:

<option value="{{ user._id }}">{{ user.firstname }} {{ user.lastname}} ({{ user.birthdate }})</option>

然后我刚刚使用它的 _id 在我的数据库(我正在使用 MongoDB)中为用户做了一个新的查询。

Python 3.6:

user_id = request.form["user"]
user = User.get_by_id(user_id)

然后我可以使用user.address 等访问它的属性。工作正常,但我对解决方案不太满意,因为我需要再次查询数据库。

所以如果有人有不同的方法,我很高兴听到它:-)

【讨论】:

  • 这可能是最好的情况,否则有人可能只是在客户端伪造对象。
  • 好的,感谢您的意见 :) 我现在会坚持使用这个解决方案。
【解决方案2】:

如果您将 json 作为字符串返回,则可以使用 json.loads。

import json
values = json.loads('{"firstname": "test","lastname": "test","birthday": "test","address": "test"}')
print(values["firstname"])

这将输出测试。请注意,您发布的字符串不是 Json。 JSON 字符串必须使用双引号。

【讨论】:

  • 好的,这就解释了为什么它不起作用。看起来我没有取回 json 而是对象的 repr。我可以用 " 替换所有 ' 但这似乎不是最好的解决方案..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
相关资源
最近更新 更多