3

Python で生成された matplotlib 画像を取得し、django によって生成された HTML ページに埋め込みたいと思います。私はdjangoに比較的慣れていないため、これを機能させるのに苦労しています。Web ページで単独で matplotlib イメージを正常に生成できますが、HTML ページに埋め込むことができませんでした。私のアプリケーションには、さまざまなデータと頻繁に変更されるデータベースからのデータを含むカスタムビューを持つ多くのユーザーがいるため、Django は理にかなっています。多くの静的ファイルを作成することは避けたいと思います。

いくつかの投稿を見てきましたが、明らかに何かが欠けています。例: DjangoでMatplotlib を使用して動的チャートを生成し、matplotlib から django サイトに画像を生成し、python を使用して matplotlib 画像を Web に動的に提供します。

temp を使用して matplotlib イメージ ビューを生成しますが、ラッパーは詳細だと思います。詳細は機能していないようです。ファイル名 plotdata.py および django チュートリアルの例のポーリングの下

from datetime import datetime, time
from django.http import HttpResponse
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
from django.contrib.auth.decorators import login_required
from django.shortcuts import render

@login_required()
def temp(request,x_id):

    #... code to generate fig for ploting - works well

    #This works but does not seem to pass file to HTML
    canvas = FigureCanvas(fig)
    response = HttpResponse(content_type='image/png')
    canvas.print_png(response)
    return response

@login_required()
def detail(request, x_id):
    render(request, 'polls/plotdata.html', {'x_id': x_id})

私の urls.py は次のとおりです。温度は正常に動作します

from django.conf.urls import patterns, url
from django.views.generic import DetailView, ListView
from polls.models import Poll
from polls import plotdata

urlpatterns = patterns('',
    #polls url chopped out for brevity - follows tutorial
    url(r'^(?P<x_id>\d+)/plotdata/temp.png$', plotdata.temp, name='temp'),
    url(r'^(?P<x_id>\d+)/plotdata/detail$', plotdata.detail, name='detail'),
)

私のplotdata.htmlは次のとおりです

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}Plotting Template{% endblock %}</title>
</head>

<body>
    <div id="content">
        {% block content %}
        <img src="{% url 'temp' x_id %}" >
        {% endblock %}
    </div>
</body>
</html>

発生するエラーは以下の通りです。

NoReverseMatch at /polls/1303070002/plotdata/detail
Reverse for 'temp' with arguments '('1303070002',)' and keyword arguments '{}' not found.

これはおそらく上記の問題だけではありません。私は何か重要なことを見逃していると確信しています。

テストとして、ハードコーディングを試みました

<img src="/polls/1303070002/plotdata/temp.png" >

しかし、それは次のエラーを生成しました

ValueError at /polls/1303070002/plotdata/detail
The view polls.plotdata.detail didn't return an HttpResponse object.

このフレームワークを機能させて、データ プロットの周りにテキストとボタンを配置できるようにしたいと考えています。ソリューションをより効率的に作成するための他の方法を受け入れます。助けてくれてありがとう!

修正されたコード、plotadata.py は次のとおりです。

    #same header information from above before this line        
    canvas = FigureCanvas(fig)      #This needs to remain for savefig or print_png command
    response = HttpResponse(content_type='image/png')
    fig.savefig(response, format='png')     #Produces all white background
    return response

def detail(request, salesorder_id):
    return render(request, 'rsa/plotdata.html', {'x_id':x_id})

今回はreturn before renderを入れました... 投票アプリとの混同を避けるため、hmtlファイルへのパスを変更しました。より一般的にフォーマットするため、savefig と print_png を使用します。urls.py は同じです。{{ x_id }} を介して変数を url に渡し、plotdata.html を上記のように動作させようとしていますが、何か不足しています。上記と同じエラー、NoReverseMatch。置き換えると、plotdata.html で

<img src="{% url 'temp' x_id %}" >

{% load staticfiles %}
<img src="{% static '/rsa/1303070001/plotdata/temp.png' %}" >

画像は必要に応じて埋め込まれます。次のような動的パスを追加します

<img src="{% static '/rsa/{{ x_id }}/plotdata/temp.png' %}" >

リテラル x_id => /rsa/%7B%7B%20x_id%20%7D%7D/plotdata/temp.png をエスケープするだけです。x_id|safe を試すと、パイプがエスケープされ、リテラルセーフが含まれます... %7B%7B%20x_id%7Csafe%20%7D%7D. したがって、url と static の使用に戻ろうとしています。よりきれいに見えます。渡している変数 x_id に何か問題があると思います

4

0 に答える 0