如何在Django模板中使用Matplotlib图像?

时间:2012-08-13 21:02:57

标签: django image templates matplotlib

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

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

然而,我不清楚的是如何将生成的图像合并到模板中,而不是让浏览器只显示图像。从教程材料中,我猜测应该可以将一些django.template.Context中包含的变量表示到django.http.HttpResponse中,但是引用的示例通过直接用Mime对象而不是构建来快速响应它它带有一个上下文。

所以我要问的是:

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

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

  3. 提前谢谢。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

此视图将提供PNG图像。只需将其绑定到"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号的{string repr。}传递给create_fig