wiki:Falcon(webapi)

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.アトリビュート==値)
Last modified 23 months ago Last modified on Mar 9, 2017, 1:42:14 PM