= 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.アトリビュート==値) }}}