Contentful Management APIについて
Contentfulでは管理画面で行うような操作もAPI経由で行うことが可能です。
例えば、記事の投稿や画像コンテンツの追加など様々ことがAPIで操作できて便利です。
今回は画像コンテンツなどを扱うAssetの追加をPythonのContentful Management APIのSDKで行う方法を整理していきます。
インストール
Contentful Management APIのPython SDKはpipでインストールすることが可能です。
pip install contentful_management
スクリプトを書く前に
ContentfulのManagement APIを利用するにはAPIキーをクライアントに渡してあげる必要があります。
APIキーの設定
API_TOKEN = os.environ['CONTENTFUL_API_TOKEN']
SPACE_ID = os.environ['CONTENTFUL_SPACE_ID']
ENVIRONMENT_ID = os.environ['CONTENTFUL_ENVIRONMENT_ID']
client = CMClient(API_TOKEN)
env = client.environments(SPACE_ID).find(ENVIRONMENT_ID)
ここではAPIキーを環境変数から取得し、Contentfulのスペースと環境を指定しています。
Assetの追加
Assetの追加は以下のように行います。
asset_id
は文字列です。
file_attributes
は辞書型です。(詳しくは後述)
Assetの追加
asset = env.assets().create(
asset_id,
file_attributes
)
asset.process()
ポイントはasset.process()
の部分です。
Assetを追加しただけではContentfulでファイルが使えるようになるわけではありません。
process
を行うことでContentful側で処理が走り、使用可能になります。
例えば、ファイルとして画像のURLを指定した場合、process
を実行するまでは画像の取得が行われないといった感じです。
file_attributesについて
file_attributes
の中身は以下のような構造になっています。
これはURLから画像を取得しContentfulに追加する場合です。
file_attributesの例
file_attributes = {
"fields": {
"title": {
"en-US": "cat" # タイトル
},
"description": {
"en-US": "cute cat" # 説明
},
"file": {
"en-US": {
"contentType": "image/jpeg", # MIMEタイプ
"fileName": "cat.jpeg", # ファイル名
"upload": "https://xxxxx.yyy/cat.jpg" # ファイルソース
}
},
},
}
もちろんローカルファイルからアップロードすることも可能です。
ここではアップロードオブジェクトを作成し、それをfile_attributes
に指定しています。
file_attributesの例(ローカルファイルをアップロードする場合)
with open('cat.jpg') as buffer:
upload = env.uploads().create(buffer) # アップロードオブジェクトを作成
file_attributes = {
"fields": {
"title": {
"en-US": "cat" # タイトル
},
"description": {
"en-US": "cute cat" # 説明
},
"file": {
"en-US": {
"contentType": "image/jpeg", # MIMEタイプ
"fileName": "cat.jpeg", # ファイル名
"uploadFrom": upload.to_link().to_json() # ファイルソース
}
},
},
}
タグの指定
Assetにはタグを指定することも可能です。
Assetのタグは以下の以下の2通りの方法で設定可能です。
作成時に指定する方法
file_attributes
に_metadata
を追加しそこでタグを指定することが可能です。
Asset作成時に指定する方法
file_attributes = {
"fields": {
# 中略
},
"_metadata": {
"tags": [{
"sys": {
"type": "Link",
"linkType": "Tag",
"id": "animal"
}
}]
}
}
後から追加する方法
後から追加する場合はAssetオブジェクトのupdate
メソッドを使用します。
ここでは更新したいプロパティのみの指定で大丈夫です。
Asset作成後に指定する方法
new_file_attributes = {
"_metadata": {
"tags": [{
"sys": {
"type": "Link",
"linkType": "Tag",
"id": "animal"
}
}]
}
}
asset.update(new_file_attributes)
終わりに
今回はContentfulのManagement APIのPython SDKを使ってアセットを追加する方法を整理しました。 タグの指定が個人的に少しハマりました。(アンダースコアからキーを始める必要がある点) ただ、簡単にファイルのアップロードができるので便利だと思います。