# 요청 (Request)

Request 인스턴스에는 해당 매개변수에서 사용할 수 있는 많은 유용한 정보가 포함되어 있습니다. 자세한 내용은 API Docs (opens new window)를 참조하세요.

# 본문 (Body)

    # 컨텍스트 (Context)

    # 요청 컨텍스트 (Request context)

    request.ctx 객체는 요청에 대해 필요한 모든 정보를 저장하는 놀이터입니다.

    인증된 사용자 세부 정보와 같은 항목을 저장하는 데 자주 사용됩니다. 나중에 middleware에 대해 더 자세히 다루겠지만 여기에 간단한 예가 있습니다.

    @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))
    

    일반적인 사용 사례는 인증 미들웨어에 데이터베이스에서 얻은 사용자 객체를 저장하는 것입니다. 추가된 키는 이후의 모든 미들웨어와 요청 기간 동안 처리기에 액세스할 수 있습니다.

    사용자 정의 컨텍스트는 애플리케이션 및 확장을 위해 예약되어 있습니다. Sanic 자체는 그것을 사용하지 않습니다.

    # 연결 컨텍스트(Connection context)

    종종 API는 동일한 클라이언트에 여러 동시(또는 연속) 요청을 제공해야 합니다. 예를 들어, 이는 데이터를 얻기 위해 여러 엔드포인트를 쿼리해야 하는 점진적 웹 앱에서 매우 자주 발생합니다.

    HTTP 프로토콜은 keep live headers를 사용하여 연결로 인한 오버헤드 시간의 완화를 요청합니다

    여러 요청이 단일 연결을 공유할 때 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)

    경로에서 추출된 값은 핸들러에 매개변수로, 더 구체적으로는 키워드 인수로 주입됩니다. Routing section에 이에 대한 자세한 내용이 있습니다.

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

    # 인수 (Arguments)

    쿼리 매개변수를 가져오기 위한 request 인스턴스에는 두 가지 속성이 있습니다.

    • 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 객체는 각 값이 목록인 사전인 몇 가지 유형 중 하나입니다. HTTP에서는 단일 키를 재사용하여 여러 값을 보낼 수 있기 때문입니다.

    대부분의 경우 .get() 메서드를 사용하여 목록이 아닌 첫 번째 요소에 액세스하기를 원할 것입니다. 모든 항목의 목록을 원하면 .getlist()를 사용할 수 있습니다.

    MIT Licensed
    Copyright © 2018-present Sanic Community Organization

    ~ Made with ❤️ and ☕️ ~