Pythonのfalconを使う
画面なんて作るから構築に時間がかかるんだ!(極論) ※なお、良心がタイトルを「まだテンプレートで消耗しているの?」にさせなかった模様。
Pythonの有名ドコロwebフレームワークは、 どれもデフォルトでテンプレート機能が用意されています。 (対してORMはDjangoくらいだったりする)
今回紹介するFalconはそのテンプレート機能すらも捨て去った漢モジュールです。
最近のスマホアプリや、javascriptによるフロントMVCの攻勢を見ると、 テンプレートはなくても良いんじゃないかと思うことがあります。
そうなるとtornadoやDjangoは少々大げさすぎる感じはするので、 サーバサイドをScrapy + mongodb + データ集計+Falconで組んで、 フロントはスマホアプリやJSに完全に任せてしまうという構成もありなきがします。
使い方
pipでいれて
pip install falcon
import json import falcon class HelloResource(object): def on_get(self,req,resp): msg={"message":"hello,falcon"} resp.body = json.dumps(msg) app = falcon.API() app.add_route("/",HelloResource()) if __name__ == "__main__": from wsgiref import simple_server httpd = simple_server.make_server("127.0.0.1",8000,app) httpd.serve_forever()
アクセスするとjsonが帰ってきます。
hook機能
デコレータでフックと呼ばれる追加機能をたせます。
def hook_func(req,resp,resource,param) print "this is hook" @falcon.before(hook_func) def on_get(self,req,resp) pass
@falcon.beforeを用いると、アクセス時に先に この関数を走らせることができます。 (同様に@falcon.afterを用いると、終了後に実行されるようです)
とこんな感じで、新しいサーバサイドの構成を考えています。 tinydbやmongodbを組み込めば、dbの中身をそのまま返せますね。
example.py
import json import falcon class HelloResource(object): def on_get(self, req, resp): msg = { "message": "Welcome to the Falcon" } resp.body = json.dumps(msg) app = falcon.API() app.add_route("/", HelloResource()) if __name__ == "__main__": from wsgiref import simple_server httpd = simple_server.make_server("127.0.0.1", 8000, app) httpd.serve_forever()
tinydb
tinydbはmongodbのようなドキュメント型データベースです。 特徴として、mongoのようにサーバーを立てる必要がありません。
web APIを叩いたりしていると、 jsonファイルを楽に扱えたらなあ、と思うことがあります。
また、簡単なプロトタイプアプリを作る場合、 データスキーマを決めたくない場合があります。
tinydbはjsonファイルとドキュメントデータベースの中間のようなデータベースです。 基本はjsonファイルですが、 サーチやインサートなどDBライクに操作でき便利です。
導入
pip install tinydb
使ってみる
テーブルは作成しなくても大丈夫です。 勉強のため、テーブル作成をやってみます。
from tinydb import TinyDB db = TinyDB("db.json") # インメモリーで使いたい時は # from tinydb.storages import MemoryStorage # db = TinyDB(stroage = MemoryStorage) table = db.table('new_table') table.insert({"data":"value"}) table.all() #[{"data":"value"}] # テーブルを全て消す db.purge_tables() データの作成
基本的には辞書型をinsertするだけです。 しかし、複数の辞書をいっぺんに投入したい場合があります。 当然forで回してインサートではなく、 マルチプルインサートしましょう。 (速度が圧倒的に違う)
from tinydb import TinyDB db = TinyDB("db.json") # 一つのみ db.insert(辞書データ) # 複数 db.insert_multiple([辞書データ,辞書データ・・・])
注意点として、リストの中に辞書型以外があってもインサートできてしまいます。
こんなの=>[{},0,{}]
しかし、辞書以外が混ざるとエラーでdbが開けなくなります。
データの検索
クエリオブジェクトを使って行えます。 いちいち、メモリに展開する記述がいらないので非常に楽です。
from tinydb import TinyDB,Query db = TinyDB("db.json") qwy = Query() # 全て db.all() db.search(qwy.データのアトリビュート=='検索値') # {k1:{k2:value}}みたいなデータのvalueが欲しい時は # qwy.k1.k2 == valueでアクセス可能 # qwy[k1][k2]とかも可能
更にqwy.アトリビュート.match(正規表現)や qwy.アトリビュート.search(正規表現)で、 正規表現を使用できます。
リスト内の値で検索する場合({k:[1,2,3]}みたいな場合) qwy.k.any([検索値のリスト])で一つでも引っかかれば返せます。 (anyではなくallにすると全一致になります)
データの更新
更新、削除も簡単です。
# 更新 db.update({更新したいkey:更新後のvalue},qwr.アトリビュート==値) # update set 更新したいkey = 更新後のvalue where アトリビュート == 値;と同じ # 削除 db.remove(qwr.アトリビュート==値)