通过保存在mysql数据库上的Django显示图片

2024-10-01 09:35:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用Django显示一张图片,它已经保存在mysql数据库中了。在所有的方法中,我发现有人使用models.Imagefield(upload_to='path'),但我认为这会将文件保存到这个目录中,其他计算机的用户以后将无法访问。 所以问题是,如何直接访问数据库并显示图片而不在中间保存?在

我已经在python中成功地做到了这一点,但我不太确定如何将代码实现到models.py中。 我的方法是这样的:

class mysqlpicture(models.Model):
    #mysqlpic=something?

    def openpic():
        connection = pymysql.connect(user='root', passwd='***',
                                     host='localhost',
                                     database='db')

        cursor = connection.cursor()

        sql1='select * from Pictures'
        cursor.execute(sql1)
        data=cursor.fetchall()

        mysqlpic=io.BytesIO(data[1][0])#one means second element of column zero 

        #img=Image.open(mysqlpic)
        #img.show()
        cursor.close()
        return mysqlpic

然后我在views.py中尝试将mysqlpic直接给予httpresponse,如下所示:

^{pr2}$

使用模板pic.html插入图片,如:

{% for n in query_results %} <mysqlpic src="{{ n.mysqlpic.url }}" /> {% endfor %}

有人知道怎么用正确的方法来做吗?在


Tags: django方法py数据库imgdatamodelsmysql
2条回答

是的,使用ImageField确实允许其他计算机的用户以后访问它。它继承FileField中的所有属性和方法,这些属性和方法将文件上载到服务器中,路径在upload\u to中指定,并将此路径保存到数据库中以保留其引用。所有这些都是在模型实例中调用save()方法时发生的。在

然后,您可以通过调用您的_instance.image_字段.url。还记得看一下MEDIA_ROOTMEDIA_URL,它们分别告诉Django保存文件的服务器根路径和处理来自media\uroot的媒体的url。在

您可以为此目的使用^{}。在

但正如django文档中所述:

Although you might think about storing files in the database, consider that it is bad design in 99% of the cases.

from django.db import models

class MysqlPicture(models.Model):
    mysqlpic = models.BinaryField()
    # ...

然后要在模板中显示,可以将二进制数据转换为base64:

^{pr2}$

模板:

{% for image in images %}
    <img src="data:;base64,{{ image }}">
{% endfor %}

相关问题 更多 >