Объект Python Google App Engine Image

Использование 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' 

Итак, экземпляр Image из Google App Engine не имеет размера?

Итак, как это работает:

 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. Из-за того, что мой объект был проанализирован шаблоном jinja2, невозможно было создать объект Image через 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 %} /> 

Я не familiair с PIL, потому что я использую другое решение от Google для обслуживания и калибровки изображений. Google может обслуживать изображения для вас, используя службу Google High Performance Image. Это означает:

  • вам нужно создать один раз, serve_url для изображений в blobstore, используя: 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/pythonhttp://img.rupython.com/pythonfunctions

Код:

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

Похоже, что версия GAE .size не реализует .size . Вместо этого используйте что-то вроде этого:

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