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

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

More than 1 year has passed since last update.

概要

この記事はPythonフレームワークの一つであるFalconの扱い方についてまとめた記事です。今回の記事は前回のその3になります。

Falconって何?って方は以下から読んで見てください。
Python軽量フレームワークFalconでAPI開発 入門(その1)

今回はMiddlewareという機能の扱い方について解説します。

Middlewareとは?

Middlewareとは、全てのリクエストに対して任意の処理を追加できる機能のことです。
それに対してHooksは、指定したリソースに対して適用されます。Middlewareは、アプリケーション全体に対して処理が適用されます。

Middlewareには以下の3つのメソッドを定義します。

  • process_request リクエストを受信後に実行
  • process_resource リソース(Resource)の到達前に実行
  • process_response レスポンスを返す前に実行(つまりリソースの処理後に実行)

process_request, process_responseに関しては、リクエストのURLに対するリソースが無い場合でも必ず実行されます。
process_resourceは、URLに対するリソースが無い場合は実行されません。

実装例

それでは実際にMiddlewareを使用してみましょう。
middlewareはアプリケーション全体に適用されるため、以下のようにしてfalcon.APIの引数にmiddlewareのクラスを指定します。

middleware自体はリソース(resource)同様に、何も継承していないただのPythonクラスです。ここではExampleMiddlewareというmiddlewareのクラスを指定しています。(この後に実装例を記述します。)

app.py
import middleware
.
.
(省略)

app = falcon.API(middleware=[
    middleware.ExampleMiddleware()
])

Middlewareのクラスを定義したファイルを作成します。
まず最初にprocess_request,process_resourceの順に実行されます。その次にリソース(resource)が実行され、最後にprocess_responseに処理が行きます。

middleware.py

class ExampleMiddleware(object):

    def process_request(self, req, resp):
        print('process_request')
        print(req)
        print(resp)

    def process_resource(self, req, resp, resource, param):
        print('process_resource')
        print(req)
        print(resp)
        print(resource)
        print(param)

    def process_response(self, req, resp, resource):
        print('process_response')
        print(req)
        print(resp)
        print(resource)

Middlewareの複数指定

Middlewareは以下のように複数指定することができます。
もしExampleMiddlewareTwo()というクラスがあった場合、カンマで区切って追加します。

app.py
import middleware
.
.
(省略)

app = falcon.API(middleware=[
    middleware.ExampleMiddleware(),
    middleware.ExampleMiddlewareTwo(),
])

Middlewareを複数指定した場合、以下のような順番でMiddlewareは実行されていきます。

ExampleMiddleware.process_request
    ExampleMiddlewareTwo.process_request
        ExampleMiddleware.process_resource
            ExampleMiddlewareTwo.process_resource
                <Resource() class>
    ExampleMiddlewareTwo.process_response
ExampleMiddleware.process_response

まとめ

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

  • ミドルウェアの作成方法
  • ミドルウェアは複数指定することが可能

次回はリクエストパラメーターの詳細について解説していこうかなと思います。

http://falcon.readthedocs.io/en/stable/api/middleware.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