Ссылка Blobs в GAE умным способом - PullRequest
1 голос
/ 15 апреля 2011

Я перевожу сайт из IIS в GAE и пытаюсь пакетно загрузить много изображений .В дополнение к этому конкретному вызову у меня есть один, который касается меня больше.Весь контент сайта (хранящийся в БД) ссылается на изображения следующим образом:

http://myurl.com/images/some-folder/maybe-another-folder/image-name.jpg

Я создал простой обработчик в Python для обслуживания изображений:

class ServeBlobs(blobstore_handlers.BlobstoreDownloadHandler):    
  def get(self, resource):        
      query = "where filename='%s'" % resource        
      blobs = blobstore.BlobInfo.gql(query).fetch(1)        
      self.send_blob(blob_infos[0])

и «маршрут» выглядит следующим образом:

('/images/(.*)', ServeBlobs)

Это прекрасно работает и не требует отдельной справочной таблицы.Тем не менее, я почти уверен, что свойство filename hte Blob не может содержать «/», так что мне делать с папками (из которых их много), называемыми some-folder или, возможно,-other-folder в приведенном выше примере?

Кроме того, почти наверняка есть совпадение имен изображений в разных папках, например,

"/images/foldera/main.jpg"
and
"/images/folderb/main.jpg"

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2011

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

Затем вы должны создать модель хранилища данных с BlobReferenceProperty, ссылающимся на BLOB-объект, с полным путем в качестве имени ключа. Таким образом, вы можете искать большой двоичный объект с помощью простого получения хранилища данных вместо более дорогого запроса, а также можете дополнительно хранить любую относящуюся к объекту информацию (например, информацию заголовка и т. Д.).

1 голос
/ 15 апреля 2011

Не прямой ответ, а скорее рекомендация:

Если это вообще возможно в вашем приложении, я бы порекомендовал попытаться перенести все ваши динамические изображения, чтобы использовать метод get_serving_url в blobstore.,Вместо того, чтобы иметь обработчик для ручной обработки ваших объектов.Это гораздо более эффективная система для обслуживания изображений и дает вам будущую гибкость доступа к встроенному изменению размера.

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

  • Вам нужно будет ПОСТАВИТЬ каждое из ваших изображений в blobstore, как вы это делаете в настоящее время, и получить обслуживающий URL для изображения blob
  • Сохранить локальную картуваши старые URL => новые URL-адреса во время миграции
  • обновляют все старые URL до новыхОбслуживание-URL в вашем приложении / данных

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

...