2019年4月10日 星期三

[GAE] Google Cloud Storage Client Library入門

  介紹Google雲端平台提供的其中一個儲存服務─ Google Cloud Storage,它主要是用來儲存媒體檔案這類資料很大的檔案。

安裝Client Library:

 
  要使用Google Cloud Storage必須安裝它的Client library。
  安裝方法請參考:https://cloud.google.com/appengine/docs/standard/python/googlecloudstorageclient/setting-up-cloud-storage
  我採用的是手動安裝,從github載下zip檔後,將裡面的cloudstorage資料夾解壓縮到專案目錄的lib資料夾下。
  Client library的使用是以第三方函式庫的方式來呼叫,因此我們要在專案資料夾下進行些設定,告訴App Engine我們要使用lib裡的函式庫。
  我們要做的就是在同app.yaml那層目錄新增下面這樣的 appengine_config.py 檔案就行了。

# appengine_config.py
import os
from google.appengine.ext import vendor

# Add any libraries install in the "lib" folder.
vendor.add(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib'))

  如此我們就可以正常 import cloudstorage 了!

如何操作:

 
  首先,import cloudstorage。
import cloudstorage as gcs

  參考前篇 [GAE] 三種雲端儲存空間介紹 ,cloud storage 能讓我們產生許多 bucket (官方中文是翻作「值區」) 來作為儲存空間,因此在做讀寫操作前我們首先要學會如何指定 bucket,那其實也很簡單,就是只要知道 bucket 的名字就好啦,在新增bucket時就會要為 bucket 命名,所以名字是使用者自己決定的,在後台也都能看到,每個專案一開始原本就有一個default的bucket可以用 (default bucket提供5GB的免費額度),我們能透過 app_identity.get_default_gcs_bucket_name() 來取得default bucket的名字。

from google.appengine.api import app_identity
bucket_name = os.environ.get('BUCKET_NAME',
                               app_identity.get_default_gcs_bucket_name())


  下面是官方的操作範例code,分別是寫、讀、列出、刪除。

  * 底下函式裡的filename參數格式是字串 "BUCKET_NAME/PATH_IN_GCS",例如:"app_default_bucket/images/my_photo.jpg",基本上就是給這樣的路徑來進行資料操作。

1. 寫入資料 (gcs.open後再write,最後要記得close) :
def create_file(self, filename):
  self.response.write('Creating file %s\n' % filename)

  write_retry_params = gcs.RetryParams(backoff_factor=1.1)
  ## RetryParams class changes default settings used to handle timeouts and retries
  gcs_file = gcs.open(filename,
                      'w',
                      content_type='text/plain',
                      options={'x-goog-meta-foo': 'foo',  # custom metadata for the file
                               'x-goog-meta-bar': 'bar'}, # this metadata can be retrieved using cloudstorage.stat
                      retry_params=write_retry_params)
  gcs_file.write('abcde\n')
  gcs_file.write('f'*1024*4 + '\n')
  gcs_file.close()
  self.tmp_filenames_to_clean_up.append(filename)

2. 讀取資料 (gcs.open後再read,最後要記得close):
def read_file(self, filename):
  self.response.write('Reading the full file contents:\n')

  gcs_file = gcs.open(filename)
  contents = gcs_file.read()
  gcs_file.close()
  self.response.write(contents)

3. 列出資料 (gcs.listbucket,會返回bucket iterator object):
def list_bucket(self, bucket):
  """Create several files and paginate through them.
  Production apps should set page_size to a practical value.
  Args:
    bucket: bucket.
  """
  self.response.write('Listbucket result:\n')

  page_size = 1
  stats = gcs.listbucket(bucket + '/foo', max_keys=page_size) # max_keys: 最多返回的file量
  while True:
    count = 0
    for stat in stats:
      count += 1
      self.response.write(repr(stat))
      self.response.write('\n')

    if count != page_size or count == 0:
      break
    stats = gcs.listbucket(bucket + '/foo', max_keys=page_size,
                           marker=stat.filename) # marker:起始file(不包含此file)(lexicographically排序)

4. 刪除資料 (gcs.delete):
def delete_files(self):
  self.response.write('Deleting files...\n')
  for filename in self.tmp_filenames_to_clean_up:
    self.response.write('Deleting file %s\n' % filename)
    try:
      gcs.delete(filename)
    except gcs.NotFoundError:
      pass



參考資料:
    1. 雲端網頁程式設計:Google App Engine使用Python
    2. https://cloud.google.com/appengine/docs/standard/python/googlecloudstorageclient/read-write-to-cloud-storage


沒有留言:

張貼留言