Как обслуживать изображения из gcs, используя стандартный движок приложения python 2.7? - PullRequest
0 голосов
/ 30 декабря 2018

Следующий код является почти дословной копией примера кода от Google для передачи файла из Google Cloud Storage через стандартную среду Python 2.7 App Engine.При локальном обслуживании с помощью команды:

dev_appserver.py --default_gcs_bucket_name darianhickman-201423.appspot.com

import cloudstorage as gcs
import webapp2

class LogoPage(webapp2.RequestHandler):
  def get(self):
    bucket_name = "darianhickman-201423.appspot.com"
    self.response.headers['Content-Type'] = 'image/jpeg'
    self.response.headers['Message'] = "LogoPage"
    gcs_file = gcs.open("/"+ bucket_name +'/logo.jpg')
    contents = gcs_file.read()
    gcs_file.close()
    self.response.body.(contents)

app = webapp2.WSGIApplication([ ('/logo.jpg', LogoPage),
                               ('/logo2.jpg', LogoPage)],
                              debug=True)

Сообщение пустого тела, которое я вижу на консоли::

NotFoundError: Expect status [200] from Google Storage. But got status 404.
Path: '/darianhickman-201423.appspot.com/logo.jpg'.
Request headers: None.
Response headers: {'date': 'Sun, 30 Dec 2018 18:54:54 GMT', 'connection': 'close', 'server': 'Development/2.0'}.
Body: ''.
Extra info: None.

Опять же, это почти идентично логике чтения, задокументированной на https://cloud.google.com/appengine/docs/standard/python/googlecloudstorageclient/read-write-to-cloud-storage

1 Ответ

0 голосов
/ 03 января 2019

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

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

Вот пример:

import os
import cloudstorage as gcs
from google.appengine.api import app_identity
import webapp2

class MainPage(webapp2.RequestHandler):
  def get(self):
    bucket_name = os.environ.get('BUCKET_NAME',app_identity.get_default_gcs_bucket_name())
    self.response.headers['Content-Type'] = 'text/plain'
    filename = "/" + bucket_name + "/testfile"

#Create file    
    gcs_file = gcs.open(filename,
                        'w',
                        content_type='text/plain')
    gcs_file.write('Hello world\n')
    gcs_file.close()

#Read file and display content    
    gcs_file = gcs.open(filename)
    contents = gcs_file.read()
    gcs_file.close()
    self.response.write(contents)

app = webapp2.WSGIApplication(
    [('/', MainPage)], debug=True)

Запустите его с dev_appserver.py --default_gcs_bucket_name a-local-bucket .

Если вы развернете свое приложение в Google App Engineтогда он будет работать (при условии, что у вас есть файл с именем logo.jpg загружен), поскольку он подключается к Google Cloud Storage.Я протестировал его с небольшими изменениями:

import os
import cloudstorage as gcs
from google.appengine.api import app_identity
import webapp2

class LogoPage(webapp2.RequestHandler):
  def get(self):
    bucket_name = os.environ.get('BUCKET_NAME',app_identity.get_default_gcs_bucket_name())
    #or you can use bucket_name = "<your-bucket-name>"
    self.response.headers['Content-Type'] = 'image/jpeg'
    self.response.headers['Message'] = "LogoPage"
    gcs_file = gcs.open("/"+ bucket_name +'/logo.jpg')
    contents = gcs_file.read()
    gcs_file.close()
    self.response.write(contents)

app = webapp2.WSGIApplication(
    [('/', LogoPage)], debug=True)

Кроме того, стоит упомянуть, что документация для Использование клиентской библиотеки с сервером приложений разработки выглядит устаревшей, в ней говорится:

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

Команда, ответственная задокументация уже была проинформирована об этой проблеме.

...