12
8

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.

Python軽量フレームワークFalconでAPI開発 入門(その2)

Last updated at Posted at 2018-03-08

概要

この記事はPythonフレームワークの一つであるFalconの扱い方についてまとめた記事です。今回の記事は前回のその2になります。
Falconは非常にシンプルな構成であり、多機能では無いもののいくつかの機能を備えています。

今回はリクエストパラメーターの取得方法とHooksという機能の扱い方について解説します。

パラメーターの取得

GETやPOSTのリクエストを受けた際、パラメーターの取得は以下のようにして行えます。

class AppResource(object):

    def on_get(self, req, resp):
        params = req.params
        resp.body = json.dumps(params)

req.paramsでパラメーターの取得を行うことができます。

例えば以下のようなGETパラメーターを指定してリクエストを送ったとします。
以下の場合はkeyがtestであり、valueがhogeになります。

  • key: test
  • value: hoge
$ curl -v 127.0.0.1:8000?test=hoge

シェルのHTTPクライアントはcurlを使うのが一般的ですが、HTTPieの方が便利です。
HTTPieの扱い方は以下に載せてあります。
https://qiita.com/ytabuchi/items/02fa15ac209823a4d19f

$ http -v GET 127.0.0.1:8000 test==hoge

実際にコマンドを叩いてリクエストを送ってみると、req.paramsの中身は以下のような感じになっています。中身は辞書型となっているため、req.params['test']でキーを指定するとvalueであるhogeを取り出すことが可能です。

{'test': 'hoge'}

Hooksの機能

Hooksは指定した__リソースの前後に任意の処理を追加できる__ことの機能です。
リソースのクラス、又はメソッドに以下のデコレーターを指定することでHooksを使うことができます。Hooksには以下のように2種類のデコレーターがあります。

  • @falcon.before 指定したリソースの直前で呼び出される
  • @falcon.after 指定したリソースの直後に呼び出される

実装例

それでは実際にHooksを使用してみます。前回作成したapp.pyに追記していきます。

app.py
.
.
(省略)
import hooks.py

@falcon.before(hooks.before_resource)
@falcon.after(hooks.after_resource)
class AppResource(object):

    def on_get(self, req, resp):

        msg = {
            "message": "Welcome to the Falcon"
        }
        resp.body = json.dumps(msg)

Hooks用のメソッドを定義したファイルを作成します。
ここではAppResourceクラスに対して処理が飛ぶと、AppResourceが呼び出される前にデコレーター@falcon.beforeで指定したhooks.pybefore_resourceメソッドが呼び出されます。
その後、AppResource内で処理が行われた後に、デコレーター@falcon.afterで指定したhooks.py内のafter_resourceメソッドに処理が飛びます。

hooks.py
def before_resource(req, resp, resource, params):
    print('hook: before_resource')
    print(req)
    print(resp)
    print(resource)
    print(params)

def after_resource(req, resp, resource):
    print('hook: after_resource')
    print(req)
    print(resp)
    print(resource)

処理の順番

つまり処理の順番は上から以下のようになります。

  1. (falcon.before) before_resource
  2. (Resource) AppResource (on_****) on_get
  3. (falcon.after) after_resource

まとめ

今回紹介したのは以下の二つです。

  • パラメーターの取得方法
  • リソースの前後に任意の処理を挟むことができる機能

次回はミドルウェアの機能について紹介していきます。

参考
http://falcon.readthedocs.io/en/stable/api/hooks.html

12
8
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
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?