Python 使用Django模型在数据库中存储图像

Python 使用Django模型在数据库中存储图像,python,database,django,Python,Database,Django,我正在使用Django创建一个Web服务,我希望该Web服务返回图像。我正在决定我的Web服务的基本架构。我在谷歌上绊倒后得出的结论是: 我应该在将图像编码为Base64格式后将其存储在DB中 当直接传输Bases64解码字符串时,传输图像将很容易 但我有一个问题,如何使用Django模型在DB中存储bases64编码的字符串?此外,如果您看到我的基本架构中有任何缺陷,请指导我 我不熟悉Web服务和Django 谢谢 您可以将图像存储在bytea字段中 bytea数据类型允许存储二进制字符串 D

我正在使用Django创建一个Web服务,我希望该Web服务返回图像。我正在决定我的Web服务的基本架构。我在谷歌上绊倒后得出的结论是:

  • 我应该在将图像编码为Base64格式后将其存储在DB中
  • 当直接传输Bases64解码字符串时,传输图像将很容易
  • 但我有一个问题,如何使用Django模型在DB中存储bases64编码的字符串?此外,如果您看到我的基本架构中有任何缺陷,请指导我

    我不熟悉Web服务和Django


    谢谢

    您可以将图像存储在bytea字段中

    bytea数据类型允许存储二进制字符串


    Django的早期版本不支持bytea字段,因此我一直在使用这个名为:

    的库。一些人说,使用DB存储图像不是一个好主意,但事实并非如此。我的建议是以以下方式使用Django with:

    首先,创建一个(或从其他人那里选择一个):

    此自定义存储可以接收Django图像,将其转换为Base64字符串,并将其发送到AppEngine Blobstore服务应用程序(例如,通过xmlrpc)

    然后,创建Django图像模型:

    from django.db import models
    from django.db.models.fields.files import ImageField
    from .storage import AppEngineBlobStorage
    
    class Photo(models.Model):
        caption = models.CharField(max_length=64, blank=True)
        blob = ImageField(
            upload_to='BlobStorage',
            storage=AppEngineBlobStorage(),
            max_length=255,
            blank=False,
        )
        serving_url = models.URLField()
        ...
    
    然后,您必须创建一个AppEngine应用程序来接收用于存储图像的Django请求,将Base64字符串转换为raw并将其存储在Blob中。例如:

    # coding=utf-8
    
    from __future__ import with_statement
    
    import webapp2
    
    from base64 import b64decode
    from StringIO import StringIO
    from xmlrpcserver import XmlRpcServer
    
    from google.appengine.api import files
    from google.appengine.api import images
    from google.appengine.ext import blobstore
    from google.appengine.ext.webapp import blobstore_handlers
    
    
    class ImageRpcServer(object):
    
        def upload(self, meta, photo, mime_type):
            data = b64decode(photo)
            file_name = files.blobstore.create(mime_type=mime_type)
            with files.open(file_name, 'a') as f:
                f.write(data)
            files.finalize(file_name)
            key = files.blobstore.get_blob_key(file_name)
            return str(key)
    
        def serving_url(self, meta, key):
            return images.get_serving_url(blobstore.BlobKey(key))
    
          ...
    
    为一团食物提供服务

    关键是功能。从谷歌文档:

    如果您正在提供图像服务,则可以使用更高效、更具潜力的 较便宜的方法是使用应用程序引擎使用get_serving_url 图像API而不是发送blob。get_service_url函数允许 您可以直接提供图像,而无需通过应用程序 引擎实例

    最后,通过使用AppEngine提供图像,您可以使用调整图像大小和裁剪图像的强大功能(查看
    get\u service\u url
    函数的文档),例如:

    # coding=utf-8
    
    from __future__ import with_statement
    
    import webapp2
    
    from base64 import b64decode
    from StringIO import StringIO
    from xmlrpcserver import XmlRpcServer
    
    from google.appengine.api import files
    from google.appengine.api import images
    from google.appengine.ext import blobstore
    from google.appengine.ext.webapp import blobstore_handlers
    
    
    class ImageRpcServer(object):
    
        def upload(self, meta, photo, mime_type):
            data = b64decode(photo)
            file_name = files.blobstore.create(mime_type=mime_type)
            with files.open(file_name, 'a') as f:
                f.write(data)
            files.finalize(file_name)
            key = files.blobstore.get_blob_key(file_name)
            return str(key)
    
        def serving_url(self, meta, key):
            return images.get_serving_url(blobstore.BlobKey(key))
    
          ...
    
    //将图像大小调整为32像素(保留纵横比)


    希望能有帮助。祝你好运

    存储图像数据库不建议用于数据库,请检查此->好答案@Cartucho,它帮助了我,谢谢!我还使用了谁已经实现了所有AppEngine blobstore连接。@Philoozushi谢谢!我很高兴它帮了你一个好答案。非常精致@阿披实沙玛谢谢!