【问题标题】:Is sending instances and processed data to render_template inefficient?将实例和处理后的数据发送到 render_template 效率低吗?
【发布时间】:2015-09-30 15:49:53
【问题描述】:

我正在模板中呈现一个实例列表,每个实例都有一个二进制 blob 图像。要渲染图像,我需要使用 base64 对它们进行编码。我不确定如何在循环中对每个图像进行编码,我下面的代码不起作用。我也不确定将对象列表和编码图像列表传递给render_template 是否会增加网络流量。如何正确编码图像列表,这是否有效?

class A:
    number = ndb.IntegerProperty()
    image = ndb.BlobProperty()
@app.route('/show-all')
def show_all():
    all = A.query().order(A.number).fetch()
    encoded_images = [b64encode(image) for all.image in all]  # Doesn't work
    return make_response(render_template("template.html", title="A", objects=all, images=encoded_images))

【问题讨论】:

  • 为什么不起作用? encoded_images = [b64encode(objimage) for obj in objs] 之类的东西应该可以正常工作
  • 好吧,我现在感觉很蠢。它确实有效......但是,这仍然不能解决第二个问题:)

标签: python google-app-engine flask


【解决方案1】:

您不会通过向render_template 发送多个内容来发送任何“额外数据”,通过网络发送的唯一数据是最终呈现的模板。

构建所有编码图像的列表有点效率低下,因为它们将立即全部存储在内存中。相反,您可以向模型添加一个属性,以便在渲染时对每个实例使用 a.b64_image。

class A:
    image = ndb.BlobProperty()

    @property
    def b64_image(self):
        return b64encode(self.image)

然后在模板中,您可以遍历对象列表中的每个项目,并获取每个项目的 base64 编码图像。

return render_template('objects.html', objects=objects)
{% for item in objects %}
<div>
    <img src="data:;base64,{{ item.b64_image }}"/>
</div>
{% endfor %}

旁注:您不必调用make_response,Flask 会自动将字符串(从render_template 返回)转换为响应。此外,make_response 和 render_template 是 Fl​​ask 的一部分,而不是 Flask-Restful。


正如我在my answer to your previous question 中所说,将图像作为数据 uri 发送效率低下,因为它们嵌入在每次生成和发送的 html 中,而不是由客户端缓存的单独文件。更高效的解决方案是将文件分别存储和服务,并将文件的路径存储在数据库中。

【讨论】:

    【解决方案2】:

    从第二个问题开始: 我不确定您的实现,但您的响应可能仅包含某种网页,因此不会通过 Internet 发送任何 python 对象,那么为什么您认为调用具有不同参数的 python 函数会导致您向最终用户发送额外的字节?

    但是,毕竟,您显然可以同时解决这两个问题。只需将 A 类对象传递给 make_response 函数,然后 inside 这个函数(因此问题 2 解决了)你可以做(​​实际上你的伪代码非常接近):

    encoded_images = [b64encode(obj.image) for obj in objects]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-06
      • 2020-05-31
      • 1970-01-01
      • 2019-11-28
      • 1970-01-01
      • 2019-09-22
      • 2011-01-01
      • 2015-08-16
      相关资源
      最近更新 更多