如何将 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 实例

如何将模板Flask中的对象显示为json?

如何将 json 对象传递给 mvc 控制器

如何将json POST数据作为对象传递给Web API方法?

如何将 JSON 对象传递给角度自定义元素

如何将两个不同的对象传递给邮递员中的 POST 请求以测试 RESTful API?