【问题标题】:How to use Matplotlib images in Django templates?如何在 Django 模板中使用 Matplotlib 图像?
【发布时间】:2012-08-13 21:02:56
【问题描述】:

背景: 我刚开始使用 Django,并且对 Python 的经验有限,所以请多多包涵。我编写了一个 Python 脚本,它定期运行(在 cron 作业中)将数据存储到 SQLite3 数据库中,我想从中读取并使用 Matplotlib(更具体地说,使用 Basemap)生成图像。这始于对学习 Python 和构建一个足够“有趣”的项目的兴趣。我之所以选择 Django 框架,是因为它的文档似乎相当完善,尽管我对 web.py 感到惊喜,因为它的要求是“轻量级”的(但 web.py 的稀疏文档使它开始有点困难) ;但目前,我还没有完全死心于一个框架。

question 1874642 中的示例几乎是我正在寻找的,图像是即时生成的,无需将其写入磁盘(因此必须定期清理生成的文件) .

但是,我不清楚如何将生成的图像合并到模板中,而不是让浏览器简单地显示图像。从教程材料中,我猜应该可以将一些 django.template.Context 中包含的变量表示为 django.http.HttpResponse,但引用的示例通过直接使用 Mime 对象而不是使用 Context 构建它来简化它.

所以我要问的是:

  1. 是否需要在生成的 Matplotlib FigureCanvas 对象上调用 print_png?还是 FigureCanvas 复制“未打印”到上下文,以便在 Django 模板中我明确编写 HTML img 标签并手动放置标签的属性?

  2. 我的印象是我将 Canvas 写入磁盘(即执行 canvas.print_figure("image.png")),以便 HTML img 标记在 Django 中看到它模板。但我想确定没有“更易于管理的方式”——即在Context 中传递图像并让模板“神奇地”生成它。如果确实需要写入磁盘,我想我可以使用 Django 的文件系统缓存工具以某种方式写入生成的图像(当然,检查是否已经为给定的输入参数集写入了图像)。我欢迎您在这方面提出建议,因为目前尚不清楚将生成的图像的大小和数量,因此我希望避免花费磁盘空间,而是更喜欢等待生成图像(即使需要几秒钟)。

提前谢谢你。

【问题讨论】:

标签: django image templates matplotlib


【解决方案1】:

您可以将StringIO对象传递给pyplot.savefig(),并通过StringIO.getvalue()获取PNG文件内容。

【讨论】:

    【解决方案2】:

    此视图将提供 PNG 图像。只需将其绑定到某个 URL,例如 "img.png" 并在 img 标记中使用它。

    def create_fig(request):
        # MPL stuff
        response = HttpResponse(content_type='image/png')
        fig.savefig(response)
        return response
    

    当然,这假设您可以独立于主视图生成图像。您可以将参数传递给图像,例如(urls.py):

    url(r'^img(?P<nr>\d+).png$', create_fig),
    

    将数字nr 的(字符串表示)传递给create_fig

    【讨论】:

      猜你喜欢
      • 2019-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 2011-11-10
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      相关资源
      最近更新 更多