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

Python 通过保存在mysql数据库上的Django显示图片,python,mysql,django,django-models,Python,Mysql,Django,Django Models,我想用Django显示一张图片,它已经保存在mysql数据库中。在所有方法中,我发现人们都使用了models.Imagefield(upload_to='path'),但我认为这将把文件保存到这个目录中,其他计算机的人以后将无法访问。 所以问题是,我如何直接访问数据库并显示图片而不在中间保存 我已经在python中实现了这一点,但我不太确定如何将代码实现到models.py中。 我的方法是这样的: class mysqlpicture(models.Model): #mysqlpic=s

我想用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
中直接向httpresponse提供
mysqlpic
,如下所示:

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
插入图片,如:

{n在查询结果%中为%
{%endfor%}
您可以用于此目的

但正如django文件中所述:

尽管您可能会考虑将文件存储在数据库中,但在99%的情况下,考虑到它是糟糕的设计。

然后要在模板中显示,您可以将二进制数据转换为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 %}
{%用于图像中的图像%}
{%endfor%}
是的,使用ImageField确实允许其他计算机的用户稍后访问它。它继承了FileField中的所有属性和方法,FileField将文件按照upload_to中指定的路径上载到服务器,并将此路径保存到数据库中以保留其引用。所有这些都是在模型实例中调用save()方法时发生的


然后,您可以通过在模板中调用_instance.image_field.url来创建url以构建链接。另外,请记住查看和,它分别告诉Django用于保存文件的服务器根路径和处理从媒体根提供的媒体的url。

如何在模型中返回BinaryField,以便稍后显示图片?@user8496104例如,将二进制数据转换为base64。我更新了答案,请检查。如果只有图片的路径存储在数据库中,这是否意味着其他人需要以某种方式与我的计算机通信以实际获取图片的数据,或者当路径保存在数据库中时意味着什么?就像Daniel说的,这并不意味着…保存在数据库中的路径与在MEDIA_root中定义的根路径相关。当您调用_instance.image_field.url时,将以您在MEDIA_url中指定的格式创建一个链接,以便其他用户能够访问该图片。
{% for image in images %}
    <img src="data:;base64,{{ image }}">
{% endfor %}