プラグ可能なビュー
バージョン0.7の新機能。
Flask 0.7では、関数ではなくクラスに基づくDjangoの汎用ビューに触発されたプラグ可能なビューが導入されています。 主な目的は、実装の一部を置き換えることができ、この方法でカスタマイズ可能なプラグ可能なビューを使用できるようにすることです。
基本的な原則
データベースからオブジェクトのリストをロードし、テンプレートにレンダリングする関数があるとします。
これは単純で柔軟性がありますが、他のモデルやテンプレートにも適応できる一般的な方法でこのビューを提供する場合は、より柔軟性が必要になる場合があります。 ここで、プラグイン可能なクラスベースのビューが配置されます。 これをクラスベースのビューに変換する最初のステップとして、次のようにします。
ご覧のとおり、flask.views.View
のサブクラスを作成し、dispatch_request()
を実装する必要があります。 次に、as_view()
クラスメソッドを使用して、そのクラスを実際のビュー関数に変換する必要があります。 その関数に渡す文字列は、ビューが持つエンドポイントの名前です。 しかし、これ自体は役に立たないので、コードを少しリファクタリングしましょう。
もちろん、これはそのような小さな例にはそれほど役立ちませんが、基本的な原則を説明するには十分です。 クラスベースのビューがある場合、self
が何を指しているのかという質問が出てきます。 これが機能する方法は、リクエストがディスパッチされるたびにクラスの新しいインスタンスが作成され、dispatch_request()
メソッドがURLルールのパラメーターを使用して呼び出されることです。 クラス自体は、as_view()
関数に渡されたパラメーターを使用してインスタンス化されます。 たとえば、次のようなクラスを作成できます。
そして、次のように登録できます。
メソッドのヒント
プラグ可能なビューは、route()
またはそれ以上のadd_url_rule()
を使用して、通常の関数のようにアプリケーションにアタッチされます。 ただし、これを添付するときに、ビューがサポートするHTTPメソッドの名前を指定する必要があることも意味します。 その情報をクラスに移動するために、次の情報を持つmethods
属性を指定できます。
メソッドベースのディスパッチ
RESTful APIの場合、HTTPメソッドごとに異なる関数を実行すると特に役立ちます。 flask.views.MethodView
を使用すると、簡単にそれを行うことができます。 各HTTPメソッドは、同じ名前の関数にマップされます(小文字のみ)。
そうすれば、methods
属性を指定する必要もありません。 クラスで定義されたメソッドに基づいて自動的に設定されます。
ビューを飾る
ビュークラス自体はルーティングシステムに追加されるビュー関数ではないため、クラス自体を装飾することはあまり意味がありません。 代わりに、as_view()
の戻り値を手作業で装飾する必要があります。
Flask 0.8以降、クラス宣言に適用するデコレータのリストを指定できる別の方法もあります。
呼び出し元の観点からの暗黙の自己のため、ビューの個々のメソッドで通常のビューデコレータを使用することはできませんが、これを覚えておいてください。
APIのメソッドビュー
Web APIはHTTP動詞と非常に緊密に連携していることが多いため、MethodView
に基づいてそのようなAPIを実装することは非常に理にかなっています。 そうは言っても、APIには、ほとんどの場合同じメソッドビューに移動するさまざまなURLルールが必要であることに気付くでしょう。 たとえば、Web上でユーザーオブジェクトを公開しているとします。
URL | メソッド | 説明 |
/users/
|
GET
|
すべてのユーザーのリストを提供します |
/users/
|
POST
|
新しいユーザーを作成します |
/users/<id>
|
GET
|
シングルユーザーを表示します |
/users/<id>
|
PUT
|
シングルユーザーを更新します |
/users/<id>
|
DELETE
|
1人のユーザーを削除します |
では、MethodView
でそれをどのように行うのでしょうか? 秘訣は、同じビューに複数のルールを提供できるという事実を利用することです。
今のところ、ビューは次のようになっていると仮定しましょう。
では、これをルーティングシステムにどのように接続するのでしょうか。 2つのルールを追加し、それぞれのメソッドに明示的に言及することにより、次のようになります。
似たようなAPIがたくさんある場合は、その登録コードをリファクタリングできます。