Falconとは
PythonのWebフレームワーク
https://falconframework.org/
仕事で簡単なAPIサーバをPythonでつくる必要があったので、高速で余計な機能のないFalconを選んでみた
Install
PythonとPyPyがインストールされている前提
pip install falcon
簡単。現在(2016/12)はv1.1
Macに入れる時は少し異なる? 詳細は公式で。
https://falcon.readthedocs.io/en/stable/user/install.html
簡単なjsonを返すAPIサンプル
以下は /hoge/{id} にgetでアクセスした時にjsonを返すAPIのサンプル
# api.py
import falcon
import json
class HogeResource(object):
    def on_get(self, req, resp, id):
        """Handles GET requests"""
        resp.status = falcon.HTTP_200
        resp.body = json.dumps({ 
                      "result": true, 
                      "message": "success!",
                    })
api = falcon.API()
hoge = HogeResource()
api.add_route('/hoge/{id}', hoge)
falcon.API()のインスタンスにadd_routeで, urlとon_get(またはon_post,on_put等)を定義したクラスのインスタンスを渡すだけでOK。簡単!
@falcon.beforeとか使ってバリデーションも行える
def validate(req, resp, resource, params):
    try:
        params['id'] = int(params['id'])
    except ValueError:
        raise falcon.HTTPBadRequest('Invalid ID',
                                    'ID was not valid.')
class HogeResource(object):
    @falcon.before(validate)
    def on_get(self, req, resp, id):
        #..略..
動作確認
WSGIサーバとして今回はgunicornを使う
api.pyというファイル名で上のコードを書いた時は
pip install gunicorn
gunicorn api:main
curl localhost:8000/hoge/12345
テスト
テストもサポートされているので書いてみた
http://falcon.readthedocs.io/en/stable/api/testing.html
# api_test.py
import falcon
import falcon.testing as testing
from api import api
class TestHogeResource(testing.TestCase):
    def setUp(self):
        super(testing.TestCase, self).setUp()
        self.api = api
    def test_hoge(self):
        result = self.simulate_get("/hoge/12345")
        self.assertEqual(result.status, falcon.HTTP_200)
    def test_hoge_error(self):
        result = self.simulate_get("/hoge/moge")
        self.assertEqual(result.status, falcon.HTTP_400)
テストの実行
testtoolsをインストールして使う
pip install testtools
python -m testtools.run api_test.py
> Ran 2 tests in 0.001s
> OK