Python Google App Engine图像对象

时间:2012-12-10 23:03:58

标签: python google-app-engine blobstore

使用Python Image Library PIL和Google App Engine 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)

我错过了什么?

编辑:

修复程序使用了@voscausa提出的get_serving_url 而不是使用我的图像服务器。 由于我的对象是由jinja2模板解析的,因此无法通过jinja2创建一个Image对象。 所以最终的解决方案如下:

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

@property
def image_url(self):
  return images.get_serving_url(self.image)

这样我可以将图片网址解析为我的网页,如:

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

2 个答案:

答案 0 :(得分:3)

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

  • 您必须使用以下命令为blobstore中的图像创建一次serve_url:get_serving_url
  • 您可以更改所投放图像的大小。原件未更改
  • Google几乎可以免费为您提供图像。您不需要处理程序。您只需支付带宽

这是一个例子。您可以更改= s0,以更改大小。 s0返回原始大小。

https://lh6.ggpht.com/1HjICy6ju1e2GIg83L0qdliUBmPHUgKV8FP3QGK8Qf2pHVBfwkpO_V38ifAPm-9m20q_3ueZzdRCYQNyDE3pmA695iaLunjE=s0

get_serving_url docs:https://developers.google.com/appengine/docs/python/images/functions

代码:

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()

答案 1 :(得分:1)

它看起来像PIL的doesn't implement .size的GAE版本。请改用这样的东西:

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