#python #django #google-app-engine #blobstore
#python #django #google-app-engine #blobstore
Вопрос:
Мое веб-приложение использует Django (django-nonrel) в Google App Engine. Я пытаюсь открыть файл Blobstore.
Мой код успешно создает файл Blobstore и объект Photo для ссылки на имя файла Blobstore (вместе с некоторыми другими метаданными).
from __future__ import with_statement
from google.appengine.api import files
import mimetypes
...
file_name = files.blobstore.create(mime_type=mimetypes.guess_type(request.FILES['photo'].name)[0])
with files.open(file_name, 'a') as f:
f.write(photo_data)
files.finalize(file_name)
photo = Photo()
photo.file_name = file_name
...
photo.save()
Однако попытка открыть файл приводит к следующей ошибке:
opened_file = open(photo.file_name)
Ошибка io в / post_photo_to_facebook/
[Ошибка 13] файл недоступен: ‘/blobstore/writable:NDNFUjNIVDdVQTM4Rk9aSE1aQkJMUzJUMzVDRVNRVEhJSjU3RUhWOE9ZMkk3QlNWR0FDR0JDOFUxSlA0Wlk3MA==’
Приветствуется любая помощь — спасибо за чтение!
Ответ №1:
Файлы Blobstore хранятся, ну, в общем, в blobstore. open
это функция, которая открывает файлы в локальной файловой системе (по модулю особых случаев, таких как запись больших двоичных объектов). Согласно документам, если вы хотите открыть файл blobstore после его завершения, вам нужно вызвать files.blobstore.get_blob_key(file_name)
имя файла, чтобы получить объект blob key, который вы должны использовать для ссылки на большой двоичный объект (и открыть его с помощью BlobReader
).).
Комментарии:
1. Спасибо, Ник, особый случай сбил меня с толку. Для чего полезно свойство file_name, возвращаемое files.blobstore.create()?
2. @bfox За создание большого двоичного объекта, как в фрагменте. Как только он будет завершен, он окажется в blobstore, и поэтому доступ к нему должен осуществляться с использованием его идентификатора большого двоичного объекта.