背景: 我开始使用Django,并且使用Python的经验有限,所以请耐心等待。我编写了一个Python脚本,它定期运行(在cron作业中)将数据存储到SQLite3数据库中,我想从中读取并使用Matplotlib生成图像(更具体地说,使用Basemap)。这开始是学习Python和构建一个“有趣”的项目的兴趣。我正在选择Django框架,因为它似乎有相当好的文档记录,虽然我对web.py感到惊喜,因为它的要求具有“轻量级”(但web.py的稀疏文档使得它开始时更难) ;但目前,我并没有完全死于框架。
question 1874642中的示例几乎就是我正在寻找的,其中图像是即时生成的,无需将其写入磁盘(因此必须定期清理生成的图像)文件)。
然而,我不清楚的是如何将生成的图像合并到模板中,而不是让浏览器只显示图像。从教程材料中,我猜测应该可以将一些django.template.Context
中包含的变量表示到django.http.HttpResponse
中,但是引用的示例通过直接用Mime对象而不是构建来快速响应它它带有一个上下文。
所以我要问的是:
是否有必要在生成的Matplotlib print_png
对象上调用FigureCanvas
?或者FigureCanvas
复制“未打印”到Context,以便在Django模板中我明确地编写HTML img
标签并手动放置标签的属性?
我认为我已将Canvas写入磁盘(即执行canvas.print_figure("image.png")
),以便HTML img
标记看到它在Django模板中。但我想确保没有“更易于管理的方式” - 即在Context
中传递图像并让模板“神奇地”生成它。如果真的有必要写入磁盘,我想我可以使用Django的文件系统缓存工具以某种方式编写生成的图像(当然,检查图像是否已经为给定的输入参数集编写)。我欢迎你提出这方面的建议,因为目前尚不清楚将要生成的图像的大小和数量,因此我希望避免花费磁盘空间而宁愿等待生成图像(即使需要几秒钟。)
提前谢谢。
答案 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
。