문제

django 앱에서 matplotlib를 사용하고 있으며 렌더링된 이미지를 직접 반환하고 싶습니다.지금까지는 갈 수 있어 plt.savefig(...), 이미지의 위치를 ​​반환합니다.

내가 하고 싶은 일은:

return HttpResponse(plt.renderfig(...), mimetype="image/png")

어떤 아이디어가 있나요?

도움이 되었습니까?

해결책

장고의 HttpResponse 객체는 파일과 유사한 API를 지원하며 파일 객체를 savefig에 전달할 수 있습니다.

response = HttpResponse(mimetype="image/png")
# create your image as usual, e.g. pylab.plot(...)
pylab.savefig(response, format="png")
return response

따라서 이미지를 직접 반환할 수 있습니다. HttpResponse.

다른 팁

~는 어때 cStringIO?

import pylab
import cStringIO
pylab.plot([3,7,2,1])
output = cStringIO.StringIO()
pylab.savefig('test.png', dpi=75)
pylab.savefig(output, dpi=75)
print output.getvalue() == open('test.png', 'rb').read() # True

에 레시피가 있어요 Matplotlib 요리책 그게 바로 이 일을 하는 거죠.핵심은 다음과 같습니다.

def simple(request):
    from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
    from matplotlib.figure import Figure

    fig=Figure()
    ax=fig.add_subplot(111)
    ax.plot(range(10), range(10), '-')
    canvas=FigureCanvas(fig)
    response=django.http.HttpResponse(content_type='image/png')
    canvas.print_png(response)
    return response

이를 뷰 파일에 넣고 URL을 가리키면 실행이 시작됩니다.

편집하다:언급한 바와 같이, 이것은 요리책에 있는 요리법을 단순화한 버전입니다.다만, 전화하는 것과는 차이가 있는 것 같습니다. print_png 그리고 savefig, 적어도 제가 했던 초기 테스트에서는요.부름 fig.savefig(response, format='png') 원본은 더 크고 배경이 흰색인 이미지를 제공했지만 canvas.print_png(response) 회색 배경으로 약간 작은 이미지를 제공했습니다.따라서 위의 마지막 몇 줄을 다음으로 바꾸겠습니다.

    canvas=FigureCanvas(fig)
    response=django.http.HttpResponse(content_type='image/png')
    fig.savefig(response, format='png')
    return response

하지만 여전히 캔버스를 인스턴스화해야 합니다.

덕타이핑을 사용하고 파일 객체로 위장하여 자신만의 객체를 전달합니다.

class MyFile(object):
    def __init__(self):
        self._data = ""
    def write(self, data):
        self._data += data

myfile = MyFile()
fig.savefig(myfile)
print myfile._data

실제 코드에서 대신 myfile = StringIO.StringIO()를 사용하고 이에 대한 응답으로 데이터를 반환할 수 있습니다.

output = StringIO.StringIO()
fig.savefig(output)
contents = output.getvalue()
return HttpResponse(contents , mimetype="image/png")
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top