Как обслуживать файлы размером более 32 МБ из GCS, используя GAE и Python 3 - PullRequest
0 голосов
/ 28 мая 2019

Я передаю некоторые файлы из GCS через приложение GAE (используя колбу), недавно я установил ограничение в 32 МБ. Согласно документации должно быть возможно обслуживать файлы из GCS, размер которых превышает 32 МБ, но я не могу найти правильный python3 apis.

Пределы ответов Динамические ответы ограничены 32 МБ. Если обработчик сценария генерирует ответ, превышающий этот предел, сервер отправляет обратно пустой ответ с кодом состояния 500 Internal Server Error. Это ограничение не распространяется на ответы, которые обслуживают данные из Blobstore или Cloud Storage.

Я нашел API-интерфейс blobstore, который может обслуживать файлы из GCS, но, к сожалению, эта библиотека устарела и не совместима с python3. Вот как я думаю, код выглядел бы так при таком подходе

blobstore_filename = '/gs/{}/{}'.format(CLOUD_STORAGE_BUCKET, path)
blob_key = blobstore.create_gs_key(blobstore_filename)

response = Response("This should be overriden by App Enginge")
response.headers['Access-Control-Allow-Origin'] = '*'
response.headers['X-AppEngine-BlobKey'] = blob_key
return response

Я думаю, что в PHP есть особый метод API, который делает именно то, что мне нужно CloudStorageTools # служить

Я видел несколько предложений по схожим проблемам для использования Подписанные URL , но это скорее обходной путь, нежели реальное решение проблемы.

Я ожидал найти метод для обслуживания контента из GCS, я не знаю, не справляются ли мои навыки поиска или мне не нужен метод для среды python3.

Ответы [ 2 ]

2 голосов
/ 28 мая 2019

В вашем приложении может быть маршрут, который возвращает перенаправление на подписанный URL-адрес GCS.
Таким образом, вы можете контролировать доступ к маршруту, но само содержимое не обслуживается вашим приложением.

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

Стандартные среды App Engineкоторые имеют эту функцию, как PHP и Python 2, делают это внутренним перенаправлением, поэтому клиент не видит доступа к GCS, но это происходит аналогично.
Ни один из специфичных для AppEngine API не доступен в стандарте Python 3, см. Здесь .

Чтобы создать подписанный URL-адрес в стандарте App Engine Python 3, вам необходимо вручную создать ключ учетной записи службы.Учетные данные приложения по умолчанию, предоставленные в Compute Engine и App Engine, нельзя использовать для цифровой подписи.Python 2, Java, Go и PHP позволяют это, потому что они используют внутренний API Identity App для генерации подписи.

Хотя они еще не доступны, Google заметил только одно замечание по этому поводу до сих пор:

В настоящее время API ядра App Engine недоступны во время выполнения Python 3.7

Так что у нас еще может быть надежда.

0 голосов
/ 29 мая 2019

Для обслуживания файлов есть два варианта:

1.-Вы можете использовать возобновляемую загрузку, чтобы загрузить объекты в ваше хранилище [1]. Вам нужно использовать только подписанный URL в начальном POSTrequest.

2.-Вы можете создать документ политики (документ политики определяет, что пользователь (с учетной записью Google или без него) может загрузить с формой POST, и предоставляет авторизацию, чтобы гарантировать, что форма может загружать файлыв целевую корзину) и используйте обычные HTML-формы для загрузки [2] [3].

Пожалуйста, дайте мне знать ваши мысли и как это происходит.

[1] https://cloud.google.com/storage/docs/access-control/signed-urls#signing-resumable

[2] https://cloud.google.com/storage/docs/xml-api/post-object#policydocument

[3] https://github.com/googleapis/google-cloud-python/issues/2861

...