最初に
この記事は「Cloudflare D1とKVをPythonから操作する①」からの続きです
必要なシークレットキーの設定などを行っている前提なので、実行中にシークレットキーが無いなどあれば前の記事を読んで設定してください
また、実装しているコードは下記に置いています
KV(Key-Valueストア)とは
前回の記事ではD1のデータベースの使い方について書きました
KVは必要なのと思われるかもしれませんが、これがあるから自分はCloudflareの有料プランを契約しました
自分が作っているwebサイトでは配信者の動画をまとめて表示するようなサイトを作っています
そのなかのページに今日の人気の動画の一覧ページがあるのですが、このページはリアルタイム更新ではなく1時間ごとに更新しています
なので、人気の動画の一覧は、
①DBから人気の動画を取得
②KVに一時保存を繰り返してwebサイトに反映
を繰り返しています
これによって、webサイトの訪問者ごとにDBがクエリで直接叩かれることを防ぐ+KVで低遅延で配信することを実現しています
Cloudflare KVをPythonで操作
Cloudflare KVの名前空間の作成
左のサイドバーから「KV」→「名前空間を作成する」をクリック
好きな名前を入れて「追加」を押します
追加すると画面の下でIDが分かります
「CLOUDFLARE_KV_NAMESPACE_ID」という名前でGoogle Colabのシークレットに登録します
Cloudflare KVにデータの登録
KVにデータを入れます
metadataとvalueを入れる必要があるのですが、valueはキーとバリューの値を入れます
metadataは空で入れています、metadataは何を入れたらいいかはわかっていません
import json
metadata = {
}
values = {
"name": "apple",
"price": "200"
}
client.kv.namespaces.values.update(key_name="fruit_list", account_id=userdata.get("CLOUDFLARE_ACCOUNT_ID"),
namespace_id=userdata.get("CLOUDFLARE_KV_NAMESPACE_ID"), metadata=json.dumps(metadata), value=json.dumps(values))
※jsonに変換して値を入れていますが、誤ってdict型にしていると下記のようなエラーが出ていました
エラー内容から型が誤っているとはわからず試行錯誤して、引数がstrってことが分かってdictからjsonに変換しないといけないのではと思って実行したら行けました
multipart put request does not contain required form field .....
成功するとClouflareのページを見ると下記のようにデータがKVに登録されていることが分かります
また、このfruit_listキーで登録されたデータは再度値を変更して登録すると上書き出来ます
ここら辺がDBとかと少し違いますね、簡単に変更ができます
Cloudflare KVからデータの読み出し
先ほど保存したデータを下記の関数で取得します
res = client.kv.namespaces.values.get(key_name="fruit_list", account_id=userdata.get("CLOUDFLARE_ACCOUNT_ID"),namespace_id=userdata.get("CLOUDFLARE_KV_NAMESPACE_ID"))
print(res.json())
{'name': 'apple', 'price': '200'}
※resの型定義が「BinaryAPIResponse」でなんだこれと思っていたのですが、
「BinaryAPIResponse」→「APIResponse」
とクラスの継承が行われていて、「APIResponse」の中に「json」関数があってこれで出力できるのでは?って試すとできました
こういう構造めっちゃ綺麗ですよね
どうやったらここまで構造化された仕様を作れるんだろうか?
まとめ
Cloudflare D1とKVをPythonでデータを読み書きする方法を説明しました
この記事を書いた理由は、PythonでWorkerを動かせる記事はあったのですが、cloudflare-pythonを使った記事がほぼなかったので書きました
あと、自分がHonoに挑戦するのでPythonからTypescriptへ移行するので忘れないうちに備忘録として書こうと思って書きました
自分はこれ以上深い使い方はしないのでこれ以上の記事を書くことはないですが、誰かの役に立てば幸いです
コメント