Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

概要

この記事は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

shimakaze_soft
Pythonエンジニア、最近はブロックチェーン、機械学習を勉強中
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away