Как обслуживать файлы размером более 32 МБ из GCS с помощью GAE и Python 3

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

Response limits Dynamic responses are limited to 32MB. If a script handler generates a response larger than this limit, the server sends back an empty response with a 500 Internal Server Error status code. This limitation does not apply to responses that serve data from the Blobstore or 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#serve

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

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
404
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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

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

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

At this time, App Engine APIs are not available in the Python 3.7 runtime

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

Я решил попробовать подписанный URL-адрес, код кажется довольно простым. ' # Создайте клиент облачного хранилища. gcs = storage.Client() Bucket = gcs.get_bucket(CLOUD_STORAGE_BUCKET) blob = Bucket.get_blob(path) url = blob.generate_signed_url(int(time.time() + 10)) return redirect(url) '

ajn 29.05.2019 10:41

Это тот, кто приводит к ошибке > AttributeError: вам нужен закрытый ключ для подписи учетных данных. Учетные данные, которые вы сейчас используете, <class 'google.auth.compute_engine.credentials.Credentials'> просто содержат токен. см. google-cloud-python.readthedocs.io/en/latest/core/… для более подробной информации. Но очевидно ли, что он работает как учетная запись службы, и из примеров, которые я нашел в Интернете, мне не нужно больше ничего предоставлять при работе в GAE. Что мне не хватает?

ajn 29.05.2019 10:47

Тот факт, что в документации говорится, что он не работает для Compute Engine (но работает для App Engine), заставляет меня немного беспокоиться о том, что в ошибке указано <class 'google.auth.compute_engine.credentials.Credentials'>. сообщение.

ajn 29.05.2019 10:48

Учетные данные приложения по умолчанию нельзя использовать для цифровой подписи. Это возможно в стандарте App Engine для некоторых языков из-за App Identity API. Вам нужно использовать управляемый вручную ключ служебной учетной записи для создания подписанных URL-адресов на Python 3. Я добавил это в ответ на случай, если кто-то попытается сделать то же самое.

Luiz Ferraz 29.05.2019 21:12

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

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

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

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

Я действительно заинтересован только в обслуживании файлов, которые у меня уже есть в ведре, поэтому GET, а не POST

ajn 29.05.2019 10:49

Большое спасибо за ваше разъяснение. В этой документации [1] рассказывается о получении объекта из корзины. Вы можете взглянуть на него, чтобы убедиться, что это то, что вам нужно, вы также можете использовать HTML-форму для загрузки. [1] cloud.google.com/storage/docs/xml-api/get-object-download

Andie Vanille 29.05.2019 23:46

Другие вопросы по теме