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