# Request

Requestインスタンスには、そのパラメータに関する有用な情報がたくさん含まれています。詳細については、APIドキュメント (opens new window) を参照してください。

# Body

    # Context

    # Request context

    request.ctxオブジェクトは、リクエストに関して必要な情報を格納するためのプレイグラウンドです。

    これは、認証されたユーザーの詳細などのアイテムを格納するためによく使用されます。ミドルウェアを使用しますが、ここでは簡単な例を示します。

    @app.on_request
    async def run_before_handler(request):
        request.ctx.user = await fetch_user_by_token(request.token)
    @app.route('/hi')
    async def hi_my_name_is(request):
        return text("Hi, my name is {}".format(request.ctx.user.name))
    

    典型的な使用例は、データベースから取得したユーザー・オブジェクトを認証ミドルウェアに格納することです。追加されたキーは、以降のすべてのミドルウェアおよびリクエストの実行中にハンドラからアクセスできます。

    カスタムコンテキストは、アプリケーションおよび拡張用に予約されています。サニック自身はそれを利用しない。

    # Connection context

    多くの場合、APIは同じクライアントに対して複数の同時 (または連続) リクエストを処理する必要があります。たとえば、データを取得するために複数のエンドポイントにクエリを実行する必要があるプログレッシブウェブアプリでは、これが頻繁に発生します。

    HTTPプロトコルでは、[keep alive headers](../ deployment/configuration.md#keep-alive-timeout)を使用した接続によって発生するオーバーヘッド時間を緩和する必要があります。

    複数のリクエストが1つの接続を共有する場合、Sanicはそれらのリクエストが状態を共有できるようにコンテキストオブジェクトを提供します。

    @app.on_request
    async def increment_foo(request):
        if not hasattr(request.conn_info.ctx, "foo"):
            request.conn_info.ctx.foo = 0
        request.conn_info.ctx.foo += 1
    @app.get("/")
    async def count_foo(request):
        return text(f"request.conn_info.ctx.foo={request.conn_info.ctx.foo}")
    
    $ curl localhost:8000 localhost:8000 localhost:8000
    request.conn_info.ctx.foo=1
    request.conn_info.ctx.foo=2
    request.conn_info.ctx.foo=3
    

    # Parameters

    パスから抽出された値は、パラメータとして、より具体的にはキーワード引数としてハンドラに注入されます。詳細については、 ルーティングセクション

    @app.route('/tag/<tag>')
    async def tag_handler(request, tag):
        return text("Tag - {}".format(tag))
    

    # Arguments

    requestインスタンスには、問合せパラメータを取得するための2つの属性があります。

    • request.args
    • request.query_args
    $ curl http://localhost:8000\?key1\=val1\&key2\=val2\&key1\=val3
    
    >>> print(request.args)
    {'key1': ['val1', 'val3'], 'key2': ['val2']}
    >>> print(request.args.get("key1"))
    val1
    >>> print(request.args.getlist("key1"))
    ['val1', 'val3']
    >>> print(request.query_args)
    [('key1', 'val1'), ('key2', 'val2'), ('key1', 'val3')]
    >>> print(request.query_string)
    key1=val1&key2=val2&key1=val3
    

    FYI

    💡 request.argsオブジェクトは、各値がリストになっているディクショナリのタイプの1つです。これは、HTTPでは1つのキーを再利用して複数の値を送信できるためです。

    ほとんどの場合、リストではなく最初の要素にアクセスするには、.get()メソッドを使用します。すべての項目のリストが必要な場合は、.getlist()を使用できます。

    MIT Licensed
    Copyright © 2018-present Sanic Community Organization

    ~ Made with ❤️ and ☕️ ~