如何使用python 2.7标准应用程序引擎从gcs提供图像?

时间:2018-12-30 19:03:30

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

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

  

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

Triggers

我在控制台上看到的空白消息是:

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)

同样,这与在上记录的读取逻辑几乎相同 https://cloud.google.com/appengine/docs/standard/python/googlecloudstorageclient/read-write-to-cloud-storage

1 个答案:

答案 0 :(得分:0)

如果您使用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的文档似乎已过时,它指出:

  

没有Cloud Storage的本地仿真,所有读取和读取请求   写入文件必须通过Internet发送到实际的Cloud Storage   桶。

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