2 回答
TA贡献1783条经验 获得超4个赞
首先,您的views.py 在 POST 的情况下返回图像。接下来的部分将告诉浏览器您返回的“页面”实际上是一张图像,并要求浏览器显示该图像。这就是为什么浏览器只显示图像。
response = HttpResponse(content_type='image/jpg') canvas = FigureCanvasAgg(fig) canvas.print_jpg(response) return response
因此,在这两种情况下,您都应该返回呈现的模板。return render(request, 'gtdefault.html', context)
我了解您想在网页中显示图像(gtdefault.html)?这意味着类似这样的事情。
{% if submitted %} <img src="you need source here" /> {% else %}
现在,棘手的部分是将源 URL 放入上下文中。您可以将生成的图像上传到 django meda 文件或某些外部存储(如 AWS S3)一段时间,然后使用从那里获得的 url。
或者您可以按照以下方式传递页面内的图像:How to display picture from memory in Django?
在第一种方法中,如果图像稍后会再次查看,则可以使用浏览器缓存。对于后一种情况,您可以忽略存储,但实现起来“更繁琐”。
TA贡献1995条经验 获得超2个赞
我将views.py中的响应更改为render(request, 'gtdefault.html', context)。为了将图像编码为base64,我必须遍历PIL的图像,然后从PIL的图像到base64。我还submitted从我的代码中删除并改为使用request.method == 'POST'. 再次感谢@Juho Rutila!
我确信可能有一种不那么迂回的方法来做到这一点,但这是我可以开始工作的第一种方法。
我修改后的views.py:
import io
import base64
from PIL import Image
def grapher_tool_input(request):
if request.method == 'POST':
form = GraphingInput(request.POST)
if form.is_valid():
cd = form.cleaned_data
fig = graph(cd['left_end'], cd['right_end'], cd['top'], cd['bottom'], cd['function'])
buf = io.BytesIO()
fig.savefig(buf, format='png')
im = Image.open(buf)
buf2 = io.BytesIO()
im.save(buf2, format='png')
im_str = base64.b64encode(buf2.getvalue()).decode()
data_uri = 'data:image/png;base64,'
data_uri += im_str
context = dict()
context['data'] = data_uri
return render(request, 'gtdefault.html', context)
else:
form = GraphingInput(initial={'left_end':-5, 'right_end':5, 'bottom':-5, 'top':5})
context ={
'form': form,
}
return render(request, 'gtdefault.html', context)
我修改后的gtdefault.html:
{% extends 'base.html' %}
{% block content %}
{% if request.method == 'POST' %}
<img src={{ data }} alt="" height="250" ,width="250">
{% else %}
<form action="" method="post" novalidate>
<table>
{{ form.as_table }}
</table>
<input type="submit" value="Graph">
{% csrf_token %}
</form>
{% endif %}
{% endblock content %}
添加回答
举报