はじめに
Webアプリを作った際、(無料枠マニアだと)サーバーサイドのログなどの保管場所に悩む場合があります
ストレージやRDBなど無料枠が無いものが多くそれらにログを出力するのも面倒です
そんなとき、REST APIで使用するFirebase Realtime Databaseがとても楽です
JsonをPostするだけでデータが追加でき、Keyを指定してGetすると対象データが取得できます
Realtime Databaseを作る
1. Firebaseのプロジェクトを作る
2. RealtimeDatabaseを作る
3. ルールを適当に書く
これをやらないと誰でもDBに書き込めてしまう
下記ルールであればGUIDが分からなければ書き込めない
本来は認証機能を使うべき
orderBy等を使用する場合はIndexを貼る必要がある
4. DBの作成完了!
DBのURL
使ってみる
コード
test.py
import requests
import json
url = "https://datastore-da5b8-default-rtdb.firebaseio.com/E87A1EE20027454E80F85BFE88513E5B/"
# POSTでInsert
res = requests.post(url + ".json", data='{"name":"tanaka","age":99}')
print("Post-Result:"+res.text)
res_data = json.loads(res.text)
# GETでSelect
res = requests.get(url + res_data["name"] + ".json")
print("Get-Result:"+res.text)
実行結果
Post-Result:{"name":"-MjFSvNWSHlmj-0psVlK"}
Get-Result:{"age":99,"name":"tanaka"}
ちょっと便利なラッパー
repository.py
import requests
class Repository:
repository_url = ""
def __init__(self, repository_url):
self.repository_url = repository_url
def select(self, repository_key, queryString=""):
return requests.get(self.repository_url + repository_key + ".json" + queryString)
def insert(self, repository_key, data):
return requests.post(self.repository_url + repository_key + ".json", data=data.encode('utf-8'))
def update(self, repository_key, data):
return requests.patch(self.repository_url + repository_key + ".json", data=data.encode('utf-8'))
def delete(self, repository_key):
return requests.delete(self.repository_url + repository_key + ".json")
ラッパーの使い方
test2.py
import json
from repository import Repository
# さまざまな要素に基づいてデータをフィルタリングするクエリを構築できます。
# 初めに、orderBy パラメータを使用して、データをどのようにフィルタリングするかを指定します。
# 次に、orderBy を他の 5 つのパラメータ(limitToFirst、limitToLast、startAt、endAt、equalTo)のいずれかと組み合わせます。
url = "https://datastore-da5b8-default-rtdb.firebaseio.com/E87A1EE20027454E80F85BFE88513E5B/"
repository = Repository(url)
res = repository.insert("", json.dumps({"key": 123, "value": "text"}))
print("insert:"+res.text)
res = repository.update(json.loads(res.text)["name"], json.dumps(
{"key": 432, "value": "aaa"}))
print("update:"+res.text)
res = repository.insert("", json.dumps({"key": 678, "value": "bbb"}))
print("insert:"+res.text)
res = repository.select("", '?orderBy="key"&limitToFirst=1')
print("select:"+res.text)
res = repository.select("", '?orderBy="value"&equalTo="bbb"')
print("select:"+res.text)
res = repository.select("")
print("select:"+res.text)
object_list = json.loads(res.text)
for key in object_list.keys():
print("child:"+key)
res = repository.delete(key)
実行結果
insert:{"name":"-MjFUn6heZhSbLtwXKqa"}
update:{"key":432,"value":"aaa"}
insert:{"name":"-MjFUnL2aCWPxGaC_BUV"}
select:{"-MjFRuYFzvirMQEOqKJy":{"age":99,"name":"tanaka"}}
select:{"-MjFUnL2aCWPxGaC_BUV":{"key":678,"value":"bbb"}}
select:{"-MjFRuYFzvirMQEOqKJy":{"age":99,"name":"tanaka"},"-MjFSN-WhdkX2sWh6ayH":{"age":99,"name":"tanaka"},"-MjFSRjuToqQCwC2FLf0":{"age":99,"name":"tanaka"},"-MjFSvNWSHlmj-0psVlK":{"age":99,"name":"tanaka"},"-MjFUn6heZhSbLtwXKqa":{"key":432,"value":"aaa"},"-MjFUnL2aCWPxGaC_BUV":{"key":678,"value":"bbb"}}
child:-MjFRuYFzvirMQEOqKJy
child:-MjFSN-WhdkX2sWh6ayH
child:-MjFSRjuToqQCwC2FLf0
child:-MjFSvNWSHlmj-0psVlK
child:-MjFUn6heZhSbLtwXKqa
child:-MjFUnL2aCWPxGaC_BUV
参考文献