Интеграция TInyPNG с Google App Engine Datastore

Мне нужно получить изображения с разных URL-адресов и сохранить их в Google Datastore после сжатия. Я понимаю, что tinyPNG - отличный API для сжатия, но API поддерживает только Amazon S3.

Может кто-нибудь посоветовать, как это сделать в Google App Engine.


person May13ank    schedule 20.09.2015    source источник


Ответы (2)


Упомянутая вами поддержка только для S3 применяется только к прямой загрузке сжатых изображений с их сервера (т. Е. Без передачи их через приложение, выполняющее запросы на сжатие изображений), что просто удобная функция. Из документации tinypng:

Загрузка в Amazon S3

Вы можете указать Tinify API загружать сжатые изображения прямо в Amazon S3. Если вы используете S3 для размещения своих изображений, это избавляет вас от необходимости загружать изображения на свой сервер и самостоятельно загружать их в S3.

Ваше приложение должно иметь возможность загружать сжатые изображения с помощью своего REST API и сохранять их в хранилище данных.

person Dan Cornilescu    schedule 10.01.2016

Поскольку Google App Engine доступен только для чтения, вы не можете записывать в него файлы с помощью встроенных функций tinify. Однако вы можете использовать хранилище BLOB-объектов в App Engine. Убедитесь, что у вас есть код tinify и модуль запросов (который использует tinify) в папке libs в вашем приложении GAE. Для работы tinify мне нужна была версия 2.3 запросов.

Чтобы использовать хранилище изображений с GAE, определите модель базы данных для объекта с хранилищем BLOB-объектов, например:

from google.appengine.ext import ndb

class Image(ndb.Model):
    img = ndb.BlobProperty()

Теперь нам нужна функция в tinify, которая записывает в хранилище BLOB-объектов объекта вместо записи в файл. Вы можете отразить существующий код tinify для записи в файл:

В файле source.py добавьте этот метод:

from google.appengine.ext import ndb

class Source(object):
    ...
    def to_blob(self, key):
        return self.result().to_blob(key)
    ...

И в result.py файле добавьте этот метод:

from google.appengine.ext import ndb

class Result(ResultMeta):
    ...
    def to_blob(self, key):
        img_store = key.get()
        img_store.img = self.data
    ...

Теперь tinify может писать в GAE, что вы можете обслуживать как хотите. Вам просто нужно создать сущность, передать ключ методу Source.to_blob (), и теперь в вашей сущности будет сохранено сжатое изображение. Итак, теперь вы можете:

class Basepage(webapp2.RequestHandler):
    def post(self):
    ...
        img_store = Image()
        img_key = img_store.put()

        # Use URL for image to be compressed
        source = tinify.from_url("http://...")
        source.to_blob(img_key)

        compressed_img_store = img_key.get()

        self.response.headers['Content-Type'] = 'image/png'
        self.response.out.write(compressed_img_store.img)
person baronsbaby    schedule 11.04.2016