как отображать изображения из хранилища данных ndb с использованием схемы URI данных (путем передачи данных в шаблон и отсутствия необходимости делать другой запрос)

Я храню эскиз изображения как свойство BLOB-объекта моей сущности. Я могу нормально обслуживать изображения, как описано здесь: Отображение изображений BLOB-объектов в Python (движок приложения)

Однако для этого требуется сделать еще один запрос на получение и получить изображение по идентификатору из ndb. Поскольку у меня уже есть исходный объект, доступный во время рендеринга тега img с соответствующим атрибутом href, существует ли способ рендеринга встроенного изображения с помощью Схема URI данных?

Я прочитал документацию по API изображений Google, но, похоже, не существует метода, который бы отображал мое изображение в требуемом формате, чтобы включить его в виде строки. Я также довольно много гуглил, но почему-то все предлагают решение для рендеринга изображений из хранилища данных, как указано выше. На мой взгляд, возможность отображать изображения с использованием схемы uri не только сэкономит запросы на получение хранилища данных (скорее всего, они будут получены из кэша памяти, но все же), но, что наиболее важно, избавит посетителей моей страницы от поездки через океан туда и обратно, что ускорит обслуживание страницы довольно значительно.

Большое спасибо за вашу помощь!


person dreamwalker    schedule 24.04.2014    source источник
comment
Вам придется реализовать это самостоятельно, это не сложно. Вы читали недостатки этого подхода. Я бы лично не стал этого делать.   -  person Tim Hoffman    schedule 24.04.2014
comment
Спасибо большое за ответ Тим! Я не знал, что у этого подхода есть недостатки. Просто почитайте немного об этом в Википедии, и кажется, что самым большим недостатком будет отсутствие возможности кэшировать изображение?   -  person dreamwalker    schedule 24.04.2014
comment
Правильно, также, если изображение появляется в нескольких местах/на страницах, браузер не может его кэшировать.   -  person Tim Hoffman    schedule 24.04.2014
comment
Я использую BlobProperties для хранения изображений и эскизов для сайта с достаточно интенсивным использованием изображений. Все также кэшируется memcache. Все это работает хорошо, хотя трафика сайта недостаточно для того, чтобы я рассматривал возможность переноса изображений в GCS, хотя, если бы он значительно увеличился, я мог бы, но, вероятно, он должен был бы вырасти в 5 раз, чтобы это стоило усилий.   -  person Tim Hoffman    schedule 24.04.2014


Ответы (1)


Используйте сервис изображений, и изображения будут обслуживаться из высокоскоростного сервиса обслуживания изображений, который, вероятно, в любом случае будет ближе к вашим конечным пользователям, чем все, что вы могли бы организовать самостоятельно в GAE.

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

get_serving_url(blob_key, size=None, crop=False, secure_url=None)

Возвращает URL-адрес, который обслуживает изображение.

Этот формат URL-адреса допускает динамическое изменение размера и обрезку, поэтому вам не нужно хранить изображения разных размеров на сервере. Изображения передаются с малой задержкой из оптимизированной инфраструктуры без файлов cookie.

Это также позволяет избежать повторного обращения к базе данных, поскольку вы сохраняете URL-адрес и передаете его пользователю.

person Paul Collingwood    schedule 24.04.2014
comment
В моей текущей реализации я храню изображение не как Blob, а как ndb.BlobProperty объекта. Если я правильно понимаю, чтобы иметь возможность использовать get_serving_url(), мне нужно будет сохранить изображение как отдельный объект Blob? (как только я получу URL-адрес обслуживания, я смогу сохранить URL-адрес на своем исходном объекте, поскольку URL-адрес не должен меняться в течение всей жизни ссылочного изображения?) - person dreamwalker; 24.04.2014
comment
Беглый взгляд на похожие вопросы говорит о том, что для таких сущностей генерировать нельзя. stackoverflow.com/questions/14897836/ Однако также должно быть так, что хранение ваших изображений в Blobstore/GCS будет значительно дешевле, чем с помощью хранилища данных. Что касается второй части вашего комментария, да, URL-адрес будет сохраняться до тех пор, пока вы не вызовете delete_serving_url. - person Paul Collingwood; 24.04.2014
comment
Большое спасибо за объяснение, Павел, очень признателен! :) - person dreamwalker; 24.04.2014