如何在 django 模板中显示已保存的动态创建的图像?

Ans*_*rty 2 html python django image matplotlib

我在视图中创建了一个图并将该图保存为模板文件夹中的 png。但是当我尝试使用<img>模板 html 文件中的标签显示此保存的图像时,该图像不会显示。这是我的文件夹结构的图像: 文件夹结构

这就是我在视图中保存我的情节的方式:

def result(request):
    if request.POST and request.FILES:
        mycsv=pd.read_csv(request.FILES['csv_file'])
        c=mycsv.X
        #We divide by the class height(basically) so that Xi+1-Xi=1
        x = [d / 5 for d in c]
        n=len(x)
        b=mycsv.Y
        divi=np.sum(b)
        f = [e / divi for e in b] 
        #Thus sum(f)=1, makes calculation of mean simpler

        #PLOTTING BEGINS
        fig = plt.figure()
        ax = plt.subplot(111)
        ax.plot(x, f)
        plt.title('Pearson Type 1 ')
        ax.legend()
        #plt.show()
        fig.savefig('polls/templates/polls/plot.png')
        context = {'n':n,}
        return render(request, 'polls/result.html', context)
    else:
        return HttpResponse("Form Not Submitted")
Run Code Online (Sandbox Code Playgroud)

我尝试获取图像的 result.html 文件是:

<h1>Graph with {{n}} points</h1>
<img src='./plot.png' />
Run Code Online (Sandbox Code Playgroud)

我在我的本地主机上运行它,权限有问题吗?

我刚刚开始学习 django 并想测试这个东西。感谢您的帮助!

Pab*_*noz 5

你的方法有很多问题,但我会试着给你一些关于如何继续的建议,尽管你可能想重新考虑它。

首先,将您的文件保存到 templates 目录不会使其可用于您的 template。模板目录是一个特殊的配置,它允许你使用 Django 的模板加载器,它不会像你的图像那样加载静态文件。

您可以将图像保存到静态文件并使用{% static %}模板标签来恢复它,但同样,这将是错误的方法,因为您的图像不是静态内容,它是动态创建的。

由于创建后图像中的数据没有用处,我的建议是使用TempFile将图像存储在临时文件中,或者(如果它足够轻)使用StringIO存储在内存中,然后将这些字节加载到上下文中作为base64

from StringIO import StringIO
import base64

img_in_memory = StringIO()
fig.savefig(img_in_memory, format="png") #dunno if your library can do that.
context['image'] = base64.b64encode(img_in_memory.getvalue())
Run Code Online (Sandbox Code Playgroud)

然后,在您的模板中,您将执行以下操作:

<img src="data:image/png;base64,{{image}}" />
Run Code Online (Sandbox Code Playgroud)