ミドルウェアの設定
警告
手動によるミドルウェアの設定は、現在では推奨されていません。代わりに、contrast-python-run
コマンドを使ってアプリケーションを実行する必要があります。このコマンドによって、フレームワーク固有のエージェントの組み込みが自動的に検出されて有効になります。詳細は、Contrastランナーを参照してください。
手動によるミドルウェアの設定が必要なまれなケースについては、以下の手順を参照してください。
ミドルウェアは、Webアプリケーションの一部を構成するソフトウェアコンポーネントであり、リクエストを受け取って必要な処理を行いレスポンスを返すことができます。
Pythonエージェントは、Contrastがサポートする全てのフレームワークのミドルウェアとして実装されます。Pythonエージェントを使用するには、アプリケーションで使用しているフレームワークのミドルウェアを設定する必要があります。
AIOHTTP
AIOHTTPミドルウェア は、aiohttpのweb.Application
コンストラクタに引数として渡されるクラスベースのミドルウェア です。次の例は、Contrastミドルウェアクラスを使用するAIOHTTPアプリケーションの例です。
from aiohttp import web from contrast.aiohttp import ContrastMiddleware routes = web.RouteTableDef() @routes.get("/") def index(request): raise web.HTTPFound("/hello") middlewares = [ContrastMiddleware(app_name="app name")] app = web.Application(middlewares=middlewares) app.add_routes(routes) web.run_app(app)
Bottle
ContrastのBottleミドルウェアはWSGIミドルウェアで、Bottleアプリケーションのインスタンスをラッピングすることによって動作します。
BottleでPythonエージェントを設定するには:
アプリケーションのコードベースで、Bottleアプリケーションのオブジェクトを検索します。これは、
bottle.Bottle
のインスタンスになります。以下はサンプルのBottleアプリケーションで、
app
はお使いのBottleアプリケーションのオブジェクトになります。from bottle import Bottle, run app = Bottle(__name__) @app.route("/") def index(): return "hello world" <InstallContrastHere> run(app)
BottleアプリケーションのオブジェクトをContrastのミドルウェアでラップします。上記の例では、
<InstallContrastHere>
を次のように置き換えます。from contrast.bottle import ContrastMiddleware app = ContrastMiddleware(app)
重要
まれに、WSGIアプリケーションオブジェクトに加えて、元のbottle.Bottle
アプリケーションインスタンスをContrastMiddleware
に直接渡すことが必要になる場合があります。アプリケーションが起動しない場合は、元のBottleアプリケーションを検索し、Contrastのミドルウェアに渡します。例えば、以下のようになります。
app = ContrastMiddleware( app, original_bottle_app, # instance of bottle.Bottle )
Django
新設定手順:Contrast Pythonエージェントのバージョン4.6.0以降はこの手順を利用します
ContrastのDjangoミドルウェアはWSGIミドルウェアであり、Djangoスタイルのミドルウェアではありません。
WSGIアプリケーションのオブジェクトを検索します。
WSGI_APPLICATION
というDjangoの設定オプションでプロジェクトのWSGIアプリを指定しますが、通常これはwsgi.py
にあります。WSGI_APPLICATION
をまだ設定していない場合は、設定する必要があります。以下はサンプルの
wsgi.py
で、application
はお使いのWSGIアプリケーションのオブジェクトになります。from django.core.wsgi import get_wsgi_application application = get_wsgi_application() <InstallContrastHere>
WSGIアプリケーションのオブジェクトをContrastのミドルウェアでラップします。上記の例では、
<InstallContrastHere>
を次のように置き換えます。from contrast.django import ContrastMiddleware application = ContrastMiddleware(application)
旧設定手順:Contrast Pythonエージェントのバージョン5.0.0以降でこの手順は利用できません
Djangoミドルウェアの設定は、settings.py
ファイルで行います。
settings.py
ファイルを検索してください。このファイルは、すべてのアプリケーションで同じ場所にあるわけではありませんが、通常はアプリケーションソースツリーの最上部などにあります。一般的な場所は次のとおりです。/settings.py
config/settings.py
app/settings.py
注記
ソースツリーでsettings.pyを検索する場合は、Pythonの仮想環境に該当するディレクトリは必ず除外してください。
アプリケーションによって、複数のsettings.pyファイルが存在し、さまざまなアプリケーション構成(例えば、本番環境やテスト環境など)に対応している場合があります。そのような場合には、Contrastエージェントのミドルウェアを使用する全ての設定に追加してください。
Contrastエージェントモジュールをリストに追加してください。
Contrastミドルウェアを可能な限りリストの最初の方に追加してください。ただし、状況によって、アプリケーションを動作させるために順序の変更が必要になる場合があります。
Django 1.10以降:配列になっている
MIDDLEWARE
という設定変数を検索します。リストにContrastエージェントモジュールを追加します。MIDDLEWARE = [ 'contrast.agent.middlewares.django_middleware.DjangoMiddleware', # OTHER MIDDLEWARE, ]
Django 1.6から1.9:settings.pyで
MIDDLEWARE_CLASSES
という設定変数を検索し、リストにContrastエージェントモジュールを追加します。MIDDLEWARE_CLASSES = [ 'contrast.agent.middlewares.legacy_django_middleware.DjangoMiddleware', # OTHER MIDDLEWARE ]
ミドルウェアの組み込みの詳細については、Djangoのドキュメントを参照してください。
Falcon(ASGI)
Falcon(ASGI)ミドルウェアは、Falcon(ASGI)アプリケーションのインスタンスをラッピングすることによって動作するASGIミドルウェアです。
以下の例は、Falcon(ASGI)アプリケーションをContrastミドルウェアのクラスでラップするサンプルです。
注記
Falcon(ASGI)アプリケーションでContrast以外のミドルウェアを使用している場合、特定の機能を動作させるために、Contrastを最初のミドルウェアとして初期化する必要があります。
import falcon.asgi from contrast.falcon_asgi import ContrastMiddleware class Home(object): async def on_get(self, req, resp): resp.status = falcon.HTTP_200 resp.body = "Hello World" def create(): # This is where the example app is declared. Look for something similar in your # application since this instance needs to be wrapped by Contrast middleware _app = falcon.asgi.App() # Add routes to your app home = Home() _app.add_route("/home", home) # This line wraps the application instance with the Contrast middleware # NOTE: Contrast should be the first middleware if others are used _app = ContrastMiddleware(_app) return _app app = create()
Falcon(WSGI)
ContrastのFalconミドルウェアはWSGIミドルウェアであり、Falconスタイルのミドルウェアではありません。
Falconアプリケーションのオブジェクトを検索します。これは、Falconのバージョンによって、
falcon.API
またはfalcon.App
のインスタンスとなります。以下はサンプルのFalconアプリケーションで、
app
はお使いのFalconアプリケーションのオブジェクトになります。import falcon from views import Home app = falcon.API() home = Home() app.add_route('/home', home) <InstallContrastHere>
FalconアプリケーションのオブジェクトをContrastのミドルウェアでラップします。上記の例では、
<InstallContrastHere>
を次のように置き換えます。from contrast.falcon import ContrastMiddleware app = ContrastMiddleware(app)
重要
まれに、WSGIアプリケーションオブジェクトに加えて、元の
falcon.App
やfalcon.API
アプリケーションインスタンスをContrastMiddleware
に直接渡すことが必要になる場合があります。アプリケーションが起動しない場合は、元のFalconアプリケーションを検索し、Contrastのミドルウェアに渡します。例えば、以下のようになります。app = ContrastMiddleware( app, original_falcon_app, # instance of falcon.App or falcon.API )
重要
ルート登録が完了後、Falconインスタンスをラップする必要があります。
FastAPI
FastAPIミドルウェアは、starlette.middleware.BaseHTTPMiddleware
に依存する、クラスベースのASGIミドルウェアです。ContrastがサポートするFastAPIのバージョンについては、Pythonエージェントのサポート対象テクノロジを確認してください。次の例は、Contrastミドルウェアクラスを使用したFastAPIアプリケーションのサンプルです。
from fastapi import FastAPI from contrast.fastapi import ContrastMiddleware app = FastAPI() app.add_middleware(ContrastMiddleware, original_app=app) @app.get("/") def read_root(): return RedirectResponse("/home")
FastAPIアプリケーションでContrast以外のミドルウェアを使用している場合、特定の機能を動作させるために、Contrastを最初のミドルウェアとして初期化する必要があります。
from fastapi import FastAPI from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware from contrast.fastapi import ContrastMiddleware app = FastAPI() # ContrastMiddleware must be the first middleware app.add_middleware(ContrastMiddleware, original_app=app) app.add_middleware(HTTPSRedirectMiddleware)
一部の機能で、FastAPIのapp
をoriginal_app
キーワードの引数として渡す必要があるため、現時点ではadd_middleware
メソッドでミドルウェアを追加する方法のみがサポートされます。ミドルウェアを直接FastAPIクラスの初期化に渡すことでミドルウェアを初期化する方法は、Contrastでは現在サポートされていません。
# Not currently supported. app = FastAPI(middleware=[...])
警告
add_middleware
を複数回呼ぶと、 前のミドルウェアが全て再初期化されます。
Flask
ContrastのFlaskミドルウェアはWSGIミドルウェアで、Flaskアプリケーションのインスタンスをラッピングすることによって動作します。
Flaskアプリケーションのオブジェクトを検索します。これは、
flask.Flask
のインスタンスになります。以下はサンプルのFlaskアプリケーションで、
app
はお使いのFlaskアプリケーションのオブジェクトになります。import Flask app = Flask(__name__) <InstallContrastHere> @app.route('/') def index(): return render_template('index.html') app.run(...)
FlaskアプリケーションのオブジェクトをContrastのミドルウェアでラップします。上記の例では、
<InstallContrastHere>
を次のように置き換えます。from contrast.flask import ContrastMiddleware app.wsgi_app = ContrastMiddleware(app)
注記
ContrastのFlaskミドルウェアは
flask.Flask.wsgi_app
ではなく、flask.Flask
のインスタンスを引数として必要とします。
Pyramid
旧設定手順:Contrast Pythonエージェントのバージョン5.0.0以降でこの手順は利用できません
Pyramidでは、ミドルウェアは「tween」と呼ばれています。
アプリケーションのコードベースで、Configuratorオブジェクトを検索します。例えば、次のようなものです。
from pyramid.config import Configurator config = Configurator() <InstallContrastHere>
Contrastのミドルウェアを設定に追加します。上記の例では、
<InstallContrastHere>
を次のように置き換えます。config.add_tween('contrast.agent.middlewares.pyramid_middleware.PyramidMiddleware')
tweenの設定に関する詳細については、Pyramidのドキュメントを参照してください。
新設定手順:Contrast Pythonエージェントのバージョン4.6.0以降ではこの手順を利用します
ContrastのPyramidミドルウェアはWSGIミドルウェアであり、Pyramidスタイルの「tween」ではありません。
WSGIアプリケーションのオブジェクトを検索します。これは、多くの場合
Configurator.make_wsgi_app()
への呼び出しによって作成されます。例えば、以下のようになります。
from pyramid.config import Configurator config = Configurator() app = config.make_wsgi_app() <InstallContrastHere>
WSGIアプリケーションのオブジェクトをContrastのミドルウェアでラップします。上記の例では、
<InstallContrastHere>
を次のように置き換えます。from contrast.pyramid import ContrastMiddleware app = ContrastMiddleware(app)
重要
まれに、アプリケーションのレジストリ(Registry)オブジェクトもミドルウェアに渡す必要がある場合があります。レジストリは通常、ConfiguratorインスタンスとPyramidアプリケーションオブジェクトの両方の属性として利用できます。
アプリケーションが起動しない場合は、アプリケーションのレジストリを検索し、Contrastのミドルウェアに渡します。以下は、その例です。
app = ContrastMiddleware(app, config.registry)
Quart
Quartミドルウェアは、Quartアプリケーションオブジェクトをラップしてasgi_app
属性に割り当てる必要があります。以下の例は、Contrastミドルウェアクラスを使用するQuartアプリケーションのサンプルです。
from quart import Quart, redirect from contrast.quart import ContrastMiddleware app = Quart(__name__) app.asgi_app = ContrastMiddleware(app) @app.route("/") async def index(): return redirect("/home")
WSGI
Contrastは、エージェントのコア機能を全て含む汎用的なWSGIミドルウェアを提供しています。ルート探索などのフレームワーク固有の機能は、汎用的なWSGIミドルウェアには実装されていません。
Contrastを使用してWSGI準拠のアプリケーションを検査するには:
アプリケーションのコードベースで、WSGIアプリケーションのオブジェクトを検索します。例えば、次のように作成されたWSGIアプリケーションがあるとします。
from example.module import make_app wsgi_app = make_app() <InstallContrastHere>
WSGIアプリケーションのオブジェクトをContrastのミドルウェアでラップします。上記の例では、
<InstallContrastHere>
を次のように置き換えます。from contrast.wsgi import ContrastMiddleware wsgi_app = ContrastMiddleware(wsgi_app)
WSGIミドルウェアの詳細については、WSGIの仕様を参照してください。
ASGI
Contrastは、汎用的なASGIミドルウェアも提供しています。汎用的なWSGIミドルウェアと同様に、ASGIミドルウェアにはエージェントのコア機能が含まれていますが、フレームワーク固有の機能はありません。
Contrastを使用してWSGI準拠のHTTP/HTTPSアプリケーションを検査するには:
コードベースで、ASGIアプリケーションのオブジェクトを検索します。例えば、次のASGIアプリがあるとします。
from example.module import make_app asgi_app = make_app() <InstallContrastHere>
ASGIアプリケーションのオブジェクトをContrastのミドルウェアでラップします。上記の例では、
<InstallContrastHere>
を次のように置き換えます。from contrast.asgi import ContrastMiddleware asgi_app = ContrastMiddleware(asgi_app)