「PythonでConoHaのオブジェクトストレージ操作を行う方法」の続きです。
Pythonを用いた、以下の操作をご紹介します。
- コンテナの作成/削除
- オブジェクトのアップロード/ダウンロード
- オブジェクトのコピー/削除
条件
- ConoHaオブジェクトストレージ
- Windows 10 64bit
- Python 3.7.0
サンプルソース全体
Pythonのサンプルソースを以下に示します。
次のような処理を関数として作成しています。
- コンテナの作成/削除
- オブジェクトのアップロード/ダウンロード
- オブジェクトのコピー/削除
# objectCRUD.py import requests import json from logging import getLogger, StreamHandler, Formatter, DEBUG, FileHandler from os import path ## ログ出力設定 logger = getLogger("オブジェクトストレージ操作") logger.setLevel(DEBUG) # コンソール出力設定 stream_handler = StreamHandler() formatter = Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') stream_handler.setFormatter(formatter) logger.addHandler(stream_handler) # 接続パラメータ USER_NAME = "gncu00000000" PASSWORD = "passpasspass" TENANT_ID = "9999999999999999999999999" URL = 'https://identity.tyo2.conoha.io/v2.0/tokens' OBJECT_STORAGE = 'https://object-storage.tyo2.conoha.io/v1/nc_9999999999999999999999999999' # オブジェクトストレージ情報 CONTAINER1 = 'sample1' CONTAINER2 = 'sample2' OBJECT = '1.jpg' UPLOAD_FILE = '2.jpg' DWONLOAD_PATH = 'C:\\test\\downlaod.jpg' def getToken(): """ tokenの取得 """ headers = { 'Accept': 'application/json', } data = '{"auth":{"passwordCredentials":{"username":"%s","password":"%s"},"tenantId":"%s"}}' % (USER_NAME, PASSWORD, TENANT_ID) #logger.debug(data) response = requests.post(URL, headers=headers, data=data) data = response.json() return json.dumps(data["access"]["token"]["id"], indent=4) def createContainer(token): """ コンテナの作成 """ headers = { 'Accept': 'application/json', 'X-Auth-Token': token, } response = requests.put(OBJECT_STORAGE + '/' + CONTAINER2, headers=headers) return response def deleteContainer(token): """ コンテナの削除 """ headers = { 'Accept': 'application/json', 'X-Auth-Token': token, } response = requests.delete(OBJECT_STORAGE + '/' + CONTAINER2, headers=headers) return response def uploadObject(token): """ オブジェクトのアップロード """ headers = { 'Accept': 'application/json', 'X-Auth-Token': token, } with open(UPLOAD_FILE, 'rb') as image: response = requests.put(OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_FILE, headers=headers, data=image) return response def downloadObject(token): """ オブジェクトのダウンロード """ headers = { 'Accept': 'application/json', 'X-Auth-Token': token, } response = requests.get(OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_FILE, headers=headers) if response.status_code == 200: with open(DWONLOAD_PATH, 'wb') as f: for chunk in response.iter_content(1024): # chunk sizeは任意で指定可能 f.write(chunk) return response def copyObject(token): """ オブジェクトのコピー """ headers = { 'Accept': 'application/json', 'X-Auth-Token': token, 'Destination': CONTAINER1 + '/' + UPLOAD_FILE, } response = requests.request(method='COPY', url=OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_FILE, headers=headers) return response def deleteObject(token): """ オブジェクトの削除 """ headers = { 'Accept': 'application/json', 'X-Auth-Token': token, } response = requests.delete(OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_FILE, headers=headers) return response def main(): """ 実処理(main) """ token = getToken().replace('\"', '') # tokenの取得 result = createContainer(token) # コンテナの作成 logger.debug('コンテナの作成:' + str(result)) result = deleteContainer(token) # コンテナの削除 logger.debug('コンテナの削除:' + str(result)) result = uploadObject(token) # オブジェクトのアップロード logger.debug('オブジェクトのアップロード:' + str(result)) result = downloadObject(token) # オブジェクトのダウンロード logger.debug('オブジェクトのダウンロード:' + str(result)) result = copyObject(token) # オブジェクトのコピー logger.debug('オブジェクトのコピー:' + str(result)) result = deleteObject(token) # オブジェクトの削除 logger.debug('オブジェクトの削除:' + str(result)) if __name__ == '__main__': """ main関数を実行 """ main()
コンテナの作成
ソース抜粋
以下の関数を実行します。
作成するコンテナ名は任意です。(ここでは「sample2」としています。)
def createContainer(token): """ コンテナの作成 """ headers = { 'Accept': 'application/json', 'X-Auth-Token': token, } response = requests.put(OBJECT_STORAGE + '/' + CONTAINER2, headers=headers) return response
実行結果
実行前
以下のようなコンテナが存在するものとします。
(オブジェクトストレージの確認には、Cyberduckを使用しています。)
実行後
C:\test>python objectCRUD.py 2019-09-03 10:29:22,019 - オブジェクトストレージ操作 - DEBUG - コンテナの作成:<Response [201]> C:\test>
「sample2」というコンテナが作成されました。
コンテナの削除
ソース抜粋
以下の関数を実行します。
「sample2」というコンテナを削除します。
def deleteContainer(token): """ コンテナの削除 """ headers = { 'Accept': 'application/json', 'X-Auth-Token': token, } response = requests.delete(OBJECT_STORAGE + '/' + CONTAINER2, headers=headers) return response
実行結果
実行前
「sample2」というコンテナが存在します。
実行後
C:\test>python objectCRUD.py 2019-09-03 10:33:15,518 - オブジェクトストレージ操作 - DEBUG - コンテナの削除:<Response [204]> C:\test>
「sample2」というコンテナが削除されました。
オブジェクトのアップロード
ソース抜粋
以下の関数を実行します。
コンテナ「sample2」に「2.jpg」というオブジェクトをアップロードします。
def uploadObject(token): """ オブジェクトのアップロード """ headers = { 'Accept': 'application/json', 'X-Auth-Token': token, } with open(UPLOAD_FILE, 'rb') as image: response = requests.put(OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_FILE, headers=headers, data=image) return response
実行結果
実行前
「sample2」という空のコンテナが存在します。
実行後
C:\test>python objectCRUD.py 2019-09-03 10:41:26,255 - オブジェクトストレージ操作 - DEBUG - オブジェクトのアップロード:<Response [201]> C:\test>
「2.jpg」というオブジェクトがアップロードされました。
オブジェクトのダウンロード
ソース抜粋
以下の関数を実行します。
- コンテナ「sample2」の「2.jpg」というオブジェクトをダウンロードします。
- 今回はダウンロードオブジェクトを以下のパスで保存しています。
C:\test\downlaod.jpg
def downloadObject(token): """ オブジェクトのダウンロード """ headers = { 'Accept': 'application/json', 'X-Auth-Token': token, } response = requests.get(OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_FILE, headers=headers) if response.status_code == 200: with open(DWONLOAD_PATH, 'wb') as f: for chunk in response.iter_content(1024): # chunk sizeは任意で指定可能 f.write(chunk) return response
実行結果
実行前
実行後
C:\test>python objectCRUD.py 2019-09-03 10:48:49,391 - オブジェクトストレージ操作 - DEBUG - オブジェクトのダウンロード:<Response [200]> C:\test>
「downlaod.jpg」というオブジェクトがダウンロードされました。
オブジェクトのコピー
ソース抜粋
以下の関数を実行します。
コンテナ「sample2」の「2.jpg」というオブジェクトを、コンテナ「sample1」の「2.jpg」としてコピーします。
def copyObject(token): """ オブジェクトのコピー """ headers = { 'Accept': 'application/json', 'X-Auth-Token': token, 'Destination': CONTAINER1 + '/' + UPLOAD_FILE, } response = requests.request(method='COPY', url=OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_FILE, headers=headers) return response
実行結果
実行前
実行後
C:\test>python objectCRUD.py 2019-09-03 10:56:59,353 - オブジェクトストレージ操作 - DEBUG - オブジェクトのコピー:<Response [201]> C:\test>
コンテナ「sample1」の「2.jpg」というオブジェクトが作成(コンテナ「sample2」の「2.jpg」からコピー)されていることがわかります。
オブジェクトの削除
ソース抜粋
以下の関数を実行します。
コンテナ「sample2」の「2.jpg」というオブジェクトを削除します。
def deleteObject(token): """ オブジェクトの削除 """ headers = { 'Accept': 'application/json', 'X-Auth-Token': token, } response = requests.delete(OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_FILE, headers=headers) return response
実行結果
実行前
実行後
C:\test>python objectCRUD.py 2019-09-03 11:01:16,888 - オブジェクトストレージ操作 - DEBUG - オブジェクトの削除:<Response [204]> C:\test>
コンテナ「sample2」の「2.jpg」というオブジェクトが削除されました。
参考
stackoverflow:transpose curl PUT to requests.put
https://stackoverflow.com/questions/17256463/transpose-curl-put-to-requests-put
stackoverflow:How to download image using requests
https://stackoverflow.com/questions/13137817/how-to-download-image-using-requests
python-requests.org
https://2.python-requests.org//en/v0.5.0/api/#functions