Как обслуживать файлы облачного хранилища с помощью App Engine SDK
В движке приложения я могу обслуживать файлы облачного хранилища, такие как PDF, используя набор приложений по умолчанию:
http://storage.googleapis.com/<appid>.appspot.com/<file_name>
Но как я могу обслуживать локальные файлы облачного хранилища в SDK, не используя blob_key?
Я пишу в ведро по умолчанию, как это:
gcs_file_name = '/%s/%s' % (app_identity.get_default_gcs_bucket_name(), file_name)
with gcs.open(gcs_file_name, 'w') as f:
f.write(data)
Имя сегмента по умолчанию в SDK = 'app_default_bucket'
В хранилище данных SDK у меня есть вид: GsFileInfo, показывающий: имя_файла: /app_default_bucket/example.pdf
Обновление и обходной путь: Вы можете получить обслуживающий URL для файлов изображений NON, таких как css, js и pdf.
gs_file = '/gs/%s/%s/%s' % (app_identity.get_default_gcs_bucket_name(), folder, filename)
serving_url = images.get_serving_url(blobstore.create_gs_key(gs_file))
3 ответа
ОБНОВЛЕНИЕ Я нашел эту функцию для обслуживания файлов облачного хранилища с помощью SDK:
Эта функция еще не была задокументирована.
http://localhost:8080/_ah/gcs/app_default_bucket/filename
Это означает, что нам не нужен URL-адрес img для показа НЕ изображений, как показано ниже!!!
Чтобы создать URL-адрес для файлов облачного хранилища, таких как изображения, css, js и pdf, в default_bucket, я использую этот код для тестирования (SDK) и создания GAE:
ВАЖНО: images.get_serving_url() работает также для НЕ изображений в SDK!
В SDK вам понадобится хранилище BLOB-объектов для чтения BLOB-объектов и создания URL-адреса обслуживания для объекта облачного хранилища.
Я также добавил код для чтения, записи и загрузки BLOB-объектов облачного хранилища в SDK и GAE.
Код можно найти здесь.
Это значение, которое вы видите в режиме разработки из app_identity_stub.py:
APP_DEFAULT_GCS_BUCKET_NAME = 'app_default_bucket'
Комментарии в этом файле объясняют это:
Эта служба ведет себя так же, как и производственная служба, за исключением использования постоянных значений вместо значений, специфичных для приложения.
Вы должны получить правильный URL в вашем рабочем коде.
РЕДАКТИРОВАТЬ:
Это с форума поддержки:
В режиме разработки инструменты механизма приложений локально имитируют сервисы Google Cloud Storage. Объекты в этой моделируемой среде непостоянны, поэтому ваше приложение перестает работать, потому что требуемый объект не существует в локальном хранилище. Если вы сначала создаете (и, возможно, пишете) объект, который пытаетесь прочитать, он должен нормально работать в режиме разработки (это было сделано для меня). Конечно, объекты в производственном сервисе являются постоянными, поэтому нет необходимости выполнять этот дополнительный шаг при запуске приложения в производственном режиме (при условии, что объект уже существует).
Надеюсь, это поможет,
Марк Google Cloud Storage Team
Это означает, что вы должны сначала написать файл, а затем использовать его. Если я правильно понимаю, вы можете использовать любое имя группы для этой цели, включая "app_default_bucket".
Раньше я был здесь в поисках ответов и просто хотел поделиться тем, что нашел, теперь, когда он у меня работает.
Вы можете сделать это сейчас, и это только немного больно. Обман изображения или API хранилища блогов не поддерживается и, похоже, больше не работает.
Увидеть:
- https://cloud.google.com/storage/docs/access-control/signed-urls
- https://cloud.google.com/storage/docs/access-control/create-signed-urls-gsutil
Если вы подписываете свои URL-адреса, вы можете давать ссылки на контент с автоматически истекающим сроком действия для анонимного или платного потребления. Вы не хотели бы обслуживать весь ваш сайт таким образом, но для PDF или чего-то подобного это допустимый и полу-безопасный вариант.
В документации отсутствует, возможно, вам придется удалить новую строку для расширенных канонических заголовков. Конечная точка хранения сообщит вам, чего она ожидает в случае плохой подписи.
Кроме того, ваш хост должен быть: https://storage-download.googleapis.com/
Если вы используете App Engine, то GoogleAccessId
is: <имя проекта>@ appspot.gserviceaccount.com
Увидеть: app_identity.get_service_account_name()
Пример того, как сгенерировать подпись:
from google.appengine.api import app_identity
def signFile(path, verb='GET', md5='', contentType='',
expiration=''):
signatureRequest = '{}\n{}\n{}\n{}\n{}'.format(
verb, md5, contentType, expiration, path)
return app_identity.sign_blob(signatureRequest)
Это возвращает кортеж (privateKey, binarySignature)
,
Теперь вам нужно построить URL. Подпись должна быть в кодировке base64, а затем в кодировке urlen. Ниже описано, как закончить создание URL. Вы должны вероятно использовать хост загрузки, упомянутый выше.
Пример URL из документов:
https: //storage.googleapis. com/example-bucket/cat.jpeg?GoogleAccessId=example@example-project.iam.gservicea ccount.com & Истекает =1458238630& Подпись =VVUgfqviDCov%2B%2BKnmVOkwBR2olSbId51kSib uQeiH8ucGFyOfAVbH5J%2B5V0gDYIioO2dDGH9Fsj6YdwxWv65HE71VEOEsVPuS8CVb%2BVeeIzmEe8z 7X7o1d%2BcWbPEo4exILQbj3ROM3T2OrkNBU9sbHq0mLbDMhiiQZ3xCaiCQdsrMEdYVvAFggPuPq%2FE QyQZmyJK3ty%2Bmr7kAFW16I9pD11jfBSD1XXjKTJzgd%2FMGSde4Va4J1RtHoX7r5i7YR7Mvf%2Fb17 zlAuGlzVUf%2FzmhLPqtfKinVrcqdlmamMcmLoW8eLG%2B1yYW%2F7tlS2hvqSfCW8eMUUjiHiSWgZLE VIG4Lw%3D%3D
Я надеюсь, что это помогает кому-то!
О, да, вам нужно делать все, что нужно для подписи, только если ваше ведро не является общедоступным (все для чтения).