12
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

EngraphiaAdvent Calendar 2016

Day 5

Pythonの軽量なwebフレームワークFalconでテストまで書く

Posted at

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
12
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?