5

背景: 私はDjangoから始めており、Pythonの経験は限られているので、ご容赦ください。定期的に(cronジョブで)実行してSQLite3データベースにデータを格納するPythonスクリプトを作成しました。このデータベースから、Matplotlib(より具体的にはBasemap)を使用して画像を読み取り、生成します。これは、Pythonを学び、「興味深い」十分なプロジェクトを構築することへの関心として始まりました。Djangoフレームワークを選択しているのは、十分に文書化されているように見えるからです。ただし、要件が「軽量」であるため、web.pyにはうれしい驚きがありました(ただし、web.pyの文書化が少ないため、最初から始めるのが少し難しくなっています)。 ; しかし、現時点では、私はフレームワークに完全に行き詰まっているわけではありません。

問題の例1874642はほぼ私が探しているものであり、画像をディスクに書き込む必要なしにオンザフライで生成されます(したがって、生成されたファイルを定期的にクリーンアップする必要があります)。

ただし、ブラウザに画像を表示させるのではなく、生成された画像をテンプレートに組み込む方法がわかりません。django.template.Contextチュートリアル資料から、いくつかに組み込まれている変数を表現できるはずだと思いますdjango.http.HttpResponseが、参照されている例では、コンテキストで構築するのではなく、Mimeオブジェクトで直接応答することでショートカットを作成しています。

だから私が求めているのは:

  1. print_png生成されたMatplotlibFigureCanvasオブジェクトでを呼び出す必要がありますか?または、FigureCanvasコピーされたものがコンテキストに「印刷されていない」ので、Djangoテンプレートで明示的にHTMLimgタグを記述し、タグの属性を手動で配置しますか?

  2. HTMLタグがDjangoテンプレートでCanvasを認識できるように、Canvasをディスクに書き込む(つまり、を実行する)必要があるという印象を受けています。しかし、「より管理しやすい方法」がないことを確認したいと思います。つまり、画像をcanvas.print_figure("image.png")imgContextテンプレートを「魔法のように」生成します。本当にディスクに書き込む必要がある場合は、Djangoのファイルシステムキャッシュ機能を使用して、生成されたイメージを何らかの方法で書き込むことができると思います(もちろん、特定の入力パラメーターセットに対してイメージが既に書き込まれているかどうかを確認します)。現時点では生成されるイメージのサイズと数がまだ明確ではないため、この点に関する提案を歓迎します。したがって、ディスクスペースを消費することを避け、代わりにイメージが生成されるのを待つことを望んでいます(数秒かかる場合でも)。

前もって感謝します。

4

2 に答える 2

2

StringIOオブジェクトをに渡しpyplot.savefig()、PNGファイルの内容を。で取得できます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

もちろん、これはメインビューから独立して画像を生成できることを前提としています。urls.py(in )のように、画像に引数を渡すことができます。

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

これは、(の文字列repr。)に数値を渡しnrますcreate_fig

于 2013-12-24T01:50:17.630 に答える