Python Google应用程序引擎图像对象

Python Google应用程序引擎图像对象,python,google-app-engine,blobstore,Python,Google App Engine,Blobstore,使用Python图像库PIL和Google应用程序引擎Blobstore 这: img = images.Image(blob_key=image) logging.info(img.size) self.response.headers['Content-Type'] = 'image/jpeg' self.response.out.write(img) 具有属性错误: AttributeError: 'Image' object has no attribute 'size' 那么goo

使用Python图像库PIL和Google应用程序引擎Blobstore

这:

img = images.Image(blob_key=image)
logging.info(img.size)
self.response.headers['Content-Type'] = 'image/jpeg'
self.response.out.write(img)
具有属性错误:

AttributeError: 'Image' object has no attribute 'size'
那么google应用程序引擎中的图像实例没有大小

那么,这是如何工作的:

img = images.Image(blob_key=image)
img.resize(width, height)
img.im_feeling_lucky()
thumbnail = img.execute_transforms(output_encoding=images.JPEG)
self.response.headers['Content-Type'] = 'image/jpeg'
self.response.out.write(thumbnail)
我错过了什么

编辑:

修复程序使用了get_serving_url,而没有使用@voscausa建议的my image server。 由于我的对象是通过jinja2模板解析的,因此不可能通过jinja2创建图像对象。 因此,最终的解决方案如下所示:

class Mandelbrot(db.Model):
  image = blobstore.BlobReferenceProperty()

@property
def image_url(self):
  return images.get_serving_url(self.image)
这样,我可以将图像url解析到我的页面,如下所示:

<img src=
{% if mandelbrot.image %}
  "{{ mandelbrot.image_url }}" 
{% else %} 
  "./assets/img/preloader.gif"
{% endif %}
/>

它看起来像是PIL的GAE版本。改用类似的方式:

logging.info((img.width, img.height))

它看起来像是PIL的GAE版本。改用类似的方式:

logging.info((img.width, img.height))

我不熟悉PIL,因为我使用谷歌的另一个解决方案来服务和调整图像大小。 谷歌可以为您提供图像,使用谷歌高性能图像服务。这意味着:

  • 您必须使用:get\u service\u url为blobstore中的图像创建一个服务\u url
  • 您可以更改服务图像的大小。原稿不变
  • 谷歌将为你免费提供这些图片。您不需要处理程序。你只需支付带宽
这里有一个例子。您可以更改=s0,以更改大小。s0返回原始大小

https://lh6.ggpht.com/1HjICy6ju1e2GIg83L0qdliUBmPHUgKV8FP3QGK8Qf2pHVBfwkpO_V38ifAPm-9m20q_3ueZzdRCYQNyDE3pmA695iaLunjE=s0
获取\u服务\u url文档:

代码:

class Dynamic(db.Model):          # key : name
    name = db.StringProperty() 
    blob_ref = blobstore.BlobReferenceProperty()
    serving_url = db.LinkProperty()

dyn= Dynamic.get_by_key_name(key_name)
try :       # get url with size = 0
    dyn.serving_url = images.get_serving_url(dyn.blob_ref, size=None, secure_url=True)
except DeadlineExceededError : 
    try :             # sometimes this request fails, retry. This always works fine
        dyn.serving_url = images.get_serving_url(dyn.blob_ref, size=None, secure_url=True)
    except DeadlineExceededError :
        logging.error('Image API get_serving_url deadline error after retry' %(dyn.key().name()))                        
        return None
    dyn.put()

我不熟悉PIL,因为我使用谷歌的另一个解决方案来服务和调整图像大小。 谷歌可以为您提供图像,使用谷歌高性能图像服务。这意味着:

  • 您必须使用:get\u service\u url为blobstore中的图像创建一个服务\u url
  • 您可以更改服务图像的大小。原稿不变
  • 谷歌将为你免费提供这些图片。您不需要处理程序。你只需支付带宽
这里有一个例子。您可以更改=s0,以更改大小。s0返回原始大小

https://lh6.ggpht.com/1HjICy6ju1e2GIg83L0qdliUBmPHUgKV8FP3QGK8Qf2pHVBfwkpO_V38ifAPm-9m20q_3ueZzdRCYQNyDE3pmA695iaLunjE=s0
获取\u服务\u url文档:

代码:

class Dynamic(db.Model):          # key : name
    name = db.StringProperty() 
    blob_ref = blobstore.BlobReferenceProperty()
    serving_url = db.LinkProperty()

dyn= Dynamic.get_by_key_name(key_name)
try :       # get url with size = 0
    dyn.serving_url = images.get_serving_url(dyn.blob_ref, size=None, secure_url=True)
except DeadlineExceededError : 
    try :             # sometimes this request fails, retry. This always works fine
        dyn.serving_url = images.get_serving_url(dyn.blob_ref, size=None, secure_url=True)
    except DeadlineExceededError :
        logging.error('Image API get_serving_url deadline error after retry' %(dyn.key().name()))                        
        return None
    dyn.put()

再解释一下。没有调整大小的第一个方法不能提供有效的图像资源。这是问题所在,而不是尺寸。你的问题实际上与PIL无关,你应该更改标题。谷歌可能会使用PIL来实现它的图像类,但这是一个完全独立的东西。没有调整大小的第一个方法不能提供有效的图像资源。这是问题所在,而不是尺寸。你的问题实际上与PIL无关,你应该更改标题。谷歌可能会使用PIL来实现它的图像类,但这是一个完全独立的东西。我的问题@Blender不是获取图像的大小,而是提供图像。不管大小。我的问题是@Blender没有得到尺寸,而是服务于图像。不管大小。这也是供参考的。我同意这是最好的方法。谢谢你的回答。但是一个简单的问题。如果您想通过模板获取服务url?例如:
object.image=self.\u save\u to\u blobstore\u和\u get\u key(image)
在将对象解析为模板时,如何在不首先创建图像对象的情况下检索url?我使用数据存储实体来引用blobstore(上次上载的版本)和服务的\u url。创建模板时,我使用此实体填充模板,并将大小(s=xxx)添加到模板中。我不理解你的代码,所以我编辑了我的答案来添加代码。是的,你的例子是正确的,尽管你在哪里更快!另外,您的示例在节省资源的同时并不总是调用
get\u serving\u url()
。另外,请参阅我更正的示例looks OK。您可以将动态大小(=sxxx)添加到模板中,如果没有定义大小,您可以添加一个默认值:=s0,比如:{{mandelbrot.image_url}}=s{{{mandelbrot.size | default('0')}}注意:您还可以使用谷歌云存储来存储图像并获取服务url,而不仅仅是blobstore。同意这是最好的方法。谢谢你的回答。但是一个简单的问题。如果您想通过模板获取服务url?例如:
object.image=self.\u save\u to\u blobstore\u和\u get\u key(image)
在将对象解析为模板时,如何在不首先创建图像对象的情况下检索url?我使用数据存储实体来引用blobstore(上次上载的版本)和服务的\u url。创建模板时,我使用此实体填充模板,并将大小(s=xxx)添加到模板中。我不理解你的代码,所以我编辑了我的答案来添加代码。是的,你的例子是正确的,尽管你在哪里更快!另外,您的示例在节省资源的同时并不总是调用
get\u serving\u url()
。另外,请参阅我更正的示例looks OK。您可以将动态大小(=sxxx)添加到模板中,如果未定义大小,则可以添加默认值:=s0,如:{{mandelbrot.image_url}}=s{{{mandelbrot.size | default('0')}}注意:您还可以使用谷歌云存储来存储图像并获取服务url,而不仅仅是blobstore。