我想用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 %}
有人知道如何以正确的方式解决这个问题吗?
答案 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_ROOT和MEDIA_URL,它们分别告诉Django保存文件的服务器根路径以及处理从 MEDIA_ROOT 提供的媒体的URL。