如何将 JSON 对象传递给 Flask 中的模板?
Posted
技术标签:
【中文标题】如何将 JSON 对象传递给 Flask 中的模板?【英文标题】:How to pass in a JSON object to a template in Flask? 【发布时间】:2021-08-30 21:19:59 【问题描述】:我一直在用 Flask 开发一个网站,最近开始重构我的路由以适应 API 框架。但是,我无法使用 Flask 的渲染模板将 JSON 数据从我的 API(来自于在 API 内的 dict
上调用 Flask 的 jsonify()
)传递到视图中。
例如,如果没有 API,视图函数的返回将如下所示
return render_template('project.html', name=proj.name, description=proj.description, tags = proj.tag_list ...)
使用 API,模型的所有相关数据都包含在 JSON 对象中,我一直在尝试以下形式:
return render_template('project.html', jsonobj=api.project.get_project(project_id))
关联的 API 函数在哪里
def get_project(id):
return jsonify(Project.query.get_or_404(id).to_dict())
但是,数据无法在 HTML 中正确呈现。如果我将字典传递给 jsonobj - 即Project.query.get_or_404(id).to_dict()
- 数据将呈现。但我不想将 JSON 重新转换为字典,因为这是一个额外的步骤。
编辑:我意识到我可能不应该使用render_template()
将数据传递给html 并填充页面(如here 所示)。似乎如果我正在构建一个 API,我应该从 javascript 填充我的 HTML。但是我不确定使用 Flask 最好的方法是什么,虽然我发现一些相关的线程不确定最佳解决方案是什么。
【问题讨论】:
根据您的描述,您不需要使用jsonify
。该函数创建一个 Response
对象,即当您想将 JSON 发送到客户端时使用它。看起来您只需要将 dict
传递给您的 render_template
函数。您已经使用 jsonify
创建了一个额外的步骤。
我明白你的意思,但一般来说 API 返回 JSON 不是很常见的做法吗?也就是说,如果我想制作一个移动应用程序,那么这个应用程序从 API 接收 JSON 会更有意义,对吧?另外,我是否仍应使用 render_template 通过 API 传递数据(请参阅编辑)?
如果您向客户端发送数据,JSON 是一种常见格式。但是,如果您在服务器上工作,即调用另一个函数来检索数据以传递给另一个函数,则无需在 dict
和 JSON 之间添加序列化和反序列化数据的开销。如果您想根据您的编辑将数据填充到已加载的页面中,您需要研究如何从您的客户端发出 AJAX 请求。
【参考方案1】:
您可以这样做,无论哪种方式,创建一个字典,然后将其作为参数传递,或者您可以使用 JSON 库进行转储,然后将其发送到前端。
data = data.to_json(orient="split")
data = json.loads(data)
data = json.dumps(data)
data =
"data":data
return data
它在我的情况下有效,看看,如果它不起作用,请告诉我,我会解决这个问题的。
【讨论】:
以上是关于如何将 JSON 对象传递给 Flask 中的模板?的主要内容,如果未能解决你的问题,请参考以下文章
将 Django 视图中的数据作为 JSON 对象传递给 vue 实例