【问题标题】:passing blob parameter to django将blob参数传递给django
【发布时间】:2010-12-31 17:13:14
【问题描述】:

我将图像作为 blob 保存在数据库中:

class MyClass(db.Model):
    icon=db.BlobProperty()

现在,我想像这样将 blob 发送到我的 HTML: 假设我有myClass 作为MyClass 的一个实例

result = """<div img_attr=%s> Bla Bla </div>""" % (myClass.icon)

有些方法是行不通的。你有什么想法吗?

【问题讨论】:

    标签: python django google-app-engine


    【解决方案1】:

    您不能只将原始图像数据转储到您的 html 页面中。您需要分两部分执行此操作:

    在你的html中,你需要引用一个图片文件:

    result = "<div>"
             "<img src='{0}' />"
             "</div>"
             .format(MYSITE + MYIMAGEDIR + myClass.name)
    

    您的浏览器读取 html 页面,发现您想要包含图像,然后寻找要包含的图像文件 - 因此它会要求您的网站提供类似 http://www.myexample.com/images/icon01.jpg 的内容

    现在,如@anand 所示,您分别使用图像内容响应此第二个请求

    【讨论】:

    • 正如代码所暗示的,它在谷歌应用程序引擎上并且不允许在其上写入文件。您必须将文件存储在 blob 存储本身中。
    【解决方案2】:

    您的代码表明您正在使用 Django 开发 Google 应用程序引擎。

    您只需要查询视图中的图像并将其作为 http 响应返回。

    image = myclassObject.icon

    响应 = HttpResponse(图像)

    response['Content-Type'] = 'image/jpg'

    返回响应

    【讨论】:

      【解决方案3】:

      存储在数据存储中并由 appengine 使用 db.BlobProperty 返回的值不是 Blob 的实际字节,而是用于引用它的 BlobKey。有两种方法可以使用该密钥。您可以创建一个 BlobReader 来将 Blob 的字节从 BlobStore 加载到您的应用程序中,或者您可以使用 ServeHandler.send_blob 制作响应以将这些字节传输到客户端。

      在 Django 中做第二个有点让人头疼,因为 ServeHandler 并不能很好地适应 Django 请求处理堆栈。这里有一个视图,它可以为你做这件事,而不会有太多麻烦:

      def get_image_data(request, key, filename):
        "serve original uploaded image"
      
        # verify the users' ability to get the requested image
        key = urllib.unquote(key)
        img = _load_metadata(request, key)
        blob = img.data;
        blobkey = blob.key()
      
        # and tell google to serve it
        response = http.HttpResponse(
            content='',
            content_type=blob.content_type)
        response['X-AppEngine-BlobKey'] = str(blobkey)
        return response
      

      【讨论】:

      • 错了。 db.BlobProperty 存储存储在数据存储实体中的 blob 数据。你在想blobstore.BlobReferenceProperty
      猜你喜欢
      • 2023-03-19
      • 2014-12-12
      • 2020-04-13
      • 2014-12-19
      • 2015-11-05
      • 1970-01-01
      • 2012-11-01
      • 2013-01-17
      相关资源
      最近更新 更多