Changes between Initial Version and Version 1 of Falcon(webapi)


Ignore:
Timestamp:
Mar 9, 2017, 1:39:23 PM (8 years ago)
Author:
admin
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Falcon(webapi)

    v1 v1  
     1= Pythonのfalconを使う =
     2
     3
     4
     5画面なんて作るから構築に時間がかかるんだ!(極論)
     6※なお、良心がタイトルを「まだテンプレートで消耗しているの?」にさせなかった模様。
     7
     8Pythonの有名ドコロwebフレームワークは、
     9どれもデフォルトでテンプレート機能が用意されています。
     10(対してORMはDjangoくらいだったりする)
     11
     12今回紹介するFalconはそのテンプレート機能すらも捨て去った漢モジュールです。
     13
     14最近のスマホアプリや、javascriptによるフロントMVCの攻勢を見ると、
     15テンプレートはなくても良いんじゃないかと思うことがあります。
     16
     17そうなるとtornadoやDjangoは少々大げさすぎる感じはするので、
     18サーバサイドをScrapy + mongodb + データ集計+Falconで組んで、
     19フロントはスマホアプリやJSに完全に任せてしまうという構成もありなきがします。
     20
     21使い方
     22
     23pipでいれて
     24
     25pip install falcon
     26
     27
     28{{{
     29import json
     30import falcon
     31
     32class HelloResource(object):
     33    def on_get(self,req,resp):
     34        msg={"message":"hello,falcon"}
     35        resp.body = json.dumps(msg)
     36
     37app = falcon.API()
     38app.add_route("/",HelloResource())
     39
     40if __name__ == "__main__":
     41    from wsgiref import simple_server
     42    httpd = simple_server.make_server("127.0.0.1",8000,app)
     43    httpd.serve_forever()
     44}}}
     45アクセスするとjsonが帰ってきます。
     46
     47hook機能
     48
     49デコレータでフックと呼ばれる追加機能をたせます。
     50
     51{{{
     52def hook_func(req,resp,resource,param)
     53    print "this is hook"
     54
     55@falcon.before(hook_func)
     56def on_get(self,req,resp)
     57    pass
     58}}}
     59
     60@falcon.beforeを用いると、アクセス時に先に
     61この関数を走らせることができます。
     62(同様に@falcon.afterを用いると、終了後に実行されるようです)
     63
     64とこんな感じで、新しいサーバサイドの構成を考えています。
     65tinydbやmongodbを組み込めば、dbの中身をそのまま返せますね。
     66
     67= tinydb =
     68
     69tinydbはmongodbのようなドキュメント型データベースです。
     70特徴として、mongoのようにサーバーを立てる必要がありません。
     71
     72web APIを叩いたりしていると、
     73jsonファイルを楽に扱えたらなあ、と思うことがあります。
     74
     75また、簡単なプロトタイプアプリを作る場合、
     76データスキーマを決めたくない場合があります。
     77
     78tinydbはjsonファイルとドキュメントデータベースの中間のようなデータベースです。
     79基本はjsonファイルですが、
     80サーチやインサートなどDBライクに操作でき便利です。
     81
     82導入
     83
     84{{{
     85pip install tinydb
     86}}}
     87
     88使ってみる
     89
     90テーブルは作成しなくても大丈夫です。
     91勉強のため、テーブル作成をやってみます。
     92
     93{{{
     94from tinydb import TinyDB
     95db = TinyDB("db.json")
     96# インメモリーで使いたい時は
     97# from tinydb.storages import MemoryStorage
     98# db = TinyDB(stroage = MemoryStorage)
     99
     100table = db.table('new_table')
     101
     102table.insert({"data":"value"})
     103table.all()
     104#[{"data":"value"}]
     105
     106# テーブルを全て消す
     107db.purge_tables()
     108データの作成
     109}}}
     110
     111
     112基本的には辞書型をinsertするだけです。
     113しかし、複数の辞書をいっぺんに投入したい場合があります。
     114当然forで回してインサートではなく、
     115マルチプルインサートしましょう。
     116(速度が圧倒的に違う)
     117
     118{{{
     119from tinydb import TinyDB
     120db = TinyDB("db.json")
     121
     122# 一つのみ
     123db.insert(辞書データ)
     124
     125# 複数
     126db.insert_multiple([辞書データ,辞書データ・・・])
     127
     128}}}
     129
     130注意点として、リストの中に辞書型以外があってもインサートできてしまいます。
     131
     132こんなの=>[{},0,{}]
     133
     134しかし、辞書以外が混ざるとエラーでdbが開けなくなります。
     135
     136データの検索
     137
     138クエリオブジェクトを使って行えます。
     139いちいち、メモリに展開する記述がいらないので非常に楽です。
     140
     141{{{
     142from tinydb import TinyDB,Query
     143db = TinyDB("db.json")
     144qwy = Query()
     145
     146# 全て
     147db.all()
     148
     149db.search(qwy.データのアトリビュート=='検索値')
     150# {k1:{k2:value}}みたいなデータのvalueが欲しい時は
     151# qwy.k1.k2 == valueでアクセス可能
     152# qwy[k1][k2]とかも可能
     153}}}
     154
     155更にqwy.アトリビュート.match(正規表現)や
     156qwy.アトリビュート.search(正規表現)で、
     157正規表現を使用できます。
     158
     159リスト内の値で検索する場合({k:[1,2,3]}みたいな場合)
     160qwy.k.any([検索値のリスト])で一つでも引っかかれば返せます。
     161(anyではなくallにすると全一致になります)
     162
     163データの更新
     164
     165更新、削除も簡単です。
     166
     167{{{
     168# 更新
     169db.update({更新したいkey:更新後のvalue},qwr.アトリビュート==値)
     170# update set 更新したいkey = 更新後のvalue where アトリビュート == 値;と同じ
     171
     172# 削除
     173db.remove(qwr.アトリビュート==値)
     174}}}