【问题标题】:How to serve image from gcs using python 2.7 standard app engine?如何使用 python 2.7 标准应用引擎从 gcs 提供图像?
【发布时间】:2019-05-27 13:55:20
【问题描述】:

以下代码几乎是 Google 示例代码的逐字副本,用于通过 Python 2.7 App Engine 标准环境从 Google Cloud Storage 提供文件。使用命令在本地服务时:

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

【问题讨论】:

    标签: python-2.7 google-cloud-platform google-cloud-storage google-app-engine-python


    【解决方案1】:

    如果您使用 dev_appserver.py 在本地提供服务,它会运行 Cloud Storage 的本地模拟,并且不会连接到实际的 Google Cloud Storage。

    尝试写入文件然后读取它。你会看到它会成功。

    这是一个示例:

    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)
    

    另外,值得一提的是Using the client library with the development app server 的文档似乎已经过时,它指出:

    没有云存储的本地模拟,所有的读取请求和 写入文件必须通过 Internet 发送到实际的云存储 桶。

    负责文档的团队已获知此问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 2011-08-04
      • 1970-01-01
      • 2013-04-03
      • 2018-04-29
      • 1970-01-01
      相关资源
      最近更新 更多