5

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

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

但是,我不清楚如何将生成的图像合并到模板中,而不是让浏览器简单地显示图像。从教程材料中,我猜应该可以将包含在某些中的变量表示django.template.Contextdjango.http.HttpResponse.

所以我要问的是:

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

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

先感谢您。

4

2 回答 2

2

您可以将StringIO对象传递给pyplot.savefig(),并通过StringIO.getvalue().

于 2012-08-14T12:50:43.583 回答
1

此视图将提供 PNG 图像。只需将其绑定到某个 URL ,然后在标签"img.png"中使用它即可。img

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

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

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

它将一个(字符串代表的)数字nr传递给create_fig.

于 2013-12-24T01:50:17.630 回答