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

时间:2017-08-28 15:54:21

标签: python mysql django django-models

我想用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,如下所示:

def MysqlView(request):
    query_results = mysqlpicture.objects.all()
    template = loader.get_template('polls/pic.html')
    context = {
        'query_results': query_results,
    }
    return HttpResponse(template.render(context, request))

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

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

有人知道如何以正确的方式解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

您可以将BinaryField用于此目的。

但正如django文件中所述:

  

虽然您可能会考虑将文件存储在数据库中,但请考虑在99%的情况下这是不好的设计。

from django.db import models

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

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

from base64 import b64encode

def mysql_view(request):
    query_results = MysqlPicture.objects.all()
    template = loader.get_template('polls/pic.html')
    context = {
        'images': [b64encode(obj.mysqlpic) for obj in query_results],
    }
    return HttpResponse(template.render(context, request))

模板:

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

答案 1 :(得分:0)

是的,使用 ImageField 确实允许其他计算机的人稍后访问它。它继承了 FileField 中的所有属性和方法,它们将文件上传到 upload_to 中指定的路径中的服务器,并将此路径保存到数据库中以保持其引用。当您在模型实例中调用 save()方法时,所有这些都会发生。

然后,您可以通过在模板中调用 your_instance.image_field.url 来创建建立链接的网址。还要记得查看MEDIA_ROOTMEDIA_URL,它们分别告诉Django保存文件的服务器根路径以及处理从 MEDIA_ROOT 提供的媒体的URL。