安裝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
沒有留言:
張貼留言