【发布时间】: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 请求。