ミドルウェアの設定

ミドルウェアは、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ミドルウェアは、Bottleアプリケーションのインスタンスをラッピングすることによって動作するWSGIミドルウェアです。

BottleでPythonエージェントを設定するには:

  1. アプリケーションのコードベースで、Bottleアプリケーションのオブジェクトを検索します。これは、bottle.Bottleのインスタンスになります。

    以下はサンプルのBottleアプリケーションで、appはお使いのBottleアプリケーションのオブジェクトになります。

    from bottle import Bottle, run
    
    app = Bottle(__name__)
    
    @app.route("/")
    def index():    
        return "hello world"
    
    <InstallContrastHere>
    
    run(app)
  2. 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スタイルのミドルウェアではありません。

  1. 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>
  2. WSGIアプリケーションのオブジェクトをContrastのミドルウェアでラップします。上記の例では、<InstallContrastHere>を次のように置き換えます。

    from contrast.django import ContrastMiddleware
    application = ContrastMiddleware(application)

旧設定手順:Contrast Pythonエージェントのバージョン5.0.0以降でこの手順は利用できません

Djangoミドルウェアの設定は、settings.pyファイルで行います。

  1. settings.pyファイルを検索してください。このファイルは、すべてのアプリケーションで同じ場所にあるわけではありませんが、通常はアプリケーションソースツリーの最上部などにあります。一般的な場所は次のとおりです。

    • /settings.py

    • config/settings.py

    • app/settings.py

    注記

    ソースツリーでsettings.pyを検索する場合は、Pythonの仮想環境に該当するディレクトリは必ず除外してください。

    アプリケーションによって、複数のsettings.pyファイルが存在し、さまざまなアプリケーション構成(例えば、本番環境やテスト環境など)に対応している場合があります。そのような場合には、Contrastエージェントのミドルウェアを使用する全ての設定に追加してください。

  2. Contrastエージェントモジュールをリストに追加してください。

    Contrastミドルウェアを可能な限りリストの最初の方に追加してください。ただし、状況によって、アプリケーションを動作させるために順序の変更が必要になる場合があります。

    • Django 1.10以降:配列になっているMIDDLEWAREという設定変数を検索します。リストにContrastエージェントモジュールを追加します。

      MIDDLEWARE = [
        'contrast.agent.middlewares.django_middleware.DjangoMiddleware',
        # OTHER MIDDLEWARE,
      ]
    • Django 1.6から1.9:settings.pyMIDDLEWARE_CLASSESという設定変数を検索し、リストにContrastエージェントモジュールを追加します。

      MIDDLEWARE_CLASSES = [
        'contrast.agent.middlewares.legacy_django_middleware.DjangoMiddleware',
        # OTHER MIDDLEWARE
      ]

    ミドルウェアの組み込みの詳細については、Djangoのドキュメントを参照してください。

Falcon

ContrastのFalconミドルウェアはWSGIミドルウェアであり、Falconスタイルのミドルウェアではありません。

  1. 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>
  2. FalconアプリケーションのオブジェクトをContrastのミドルウェアでラップします。上記の例では、<InstallContrastHere>を次のように置き換えます。

    from contrast.falcon import ContrastMiddleware
    app = ContrastMiddleware(app)

    重要

    まれに、WSGIアプリケーションオブジェクトに加えて、元のfalcon.Appfalcon.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のapporiginal_appキーワードの引数として渡す必要があるため、現時点ではadd_middleware メソッドでミドルウェアを追加する方法のみがサポートされます。ミドルウェアを直接FastAPIクラスの初期化に渡すことでミドルウェアを初期化する方法は、Contrastでは現在サポートされていません。

# Not currently supported.
app = FastAPI(middleware=[...])

警告

add_middlewareを複数回呼ぶと、 前のミドルウェアが全て再初期化されます。

Flask

ContrastのFlaskは、Flaskアプリケーションのインスタンスをラッピングすることによって動作するWSGIミドルウェアです。

  1. Flaskアプリケーションのオブジェクトを検索します。これは、flask.Flaskのインスタンスになります。

    以下はサンプルのFlaskアプリケーションで、appはお使いのFlaskアプリケーションのオブジェクトになります。

    import Flask
    
    app = Flask(__name__)
    
    <InstallContrastHere>
    
    @app.route('/')
    def index():
        return render_template('index.html')
    
    app.run(...) 
    
  2. 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」と呼ばれています。

  1. アプリケーションのコードベースで、Configuratorオブジェクトを検索します。例えば、次のようなものです。

    from pyramid.config import Configurator
    config = Configurator()
    
    <InstallContrastHere>
  2. Contrastのミドルウェアを設定に追加します。上記の例では、<InstallContrastHere>を次のように置き換えます。

    config.add_tween('contrast.agent.middlewares.pyramid_middleware.PyramidMiddleware')

    tweenの設定に関する詳細については、Pyramidのドキュメントを参照してください。

新設定手順:Contrast Pythonエージェントのバージョン4.6.0以降ではこの手順を利用します

ContrastのPyramidミドルウェアはWSGIミドルウェアであり、Pyramidスタイルの「tween」ではありません。

  1. WSGIアプリケーションのオブジェクトを検索します。これは、多くの場合Configurator.make_wsgi_app()への呼び出しによって作成されます。

    例えば、以下のようになります。

    from pyramid.config import Configurator
    
    config = Configurator()
    app = config.make_wsgi_app()
    
    <InstallContrastHere>
  2. 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準拠のアプリケーションを検査するには:

  1. アプリケーションのコードベースで、WSGIアプリケーションのオブジェクトを検索します。例えば、次のように作成されたWSGIアプリケーションがあるとします。

    from example.module import make_app
    wsgi_app = make_app() 
    
    <InstallContrastHere>
  2. WSGIアプリケーションのオブジェクトをContrastのミドルウェアでラップします。上記の例では、<InstallContrastHere>を次のように置き換えます。

    from contrast.wsgi import ContrastMiddleware
    wsgi_app = ContrastMiddleware(wsgi_app)

WSGIミドルウェアの詳細については、WSGIの仕様を参照してください。