# 요청 (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()
를 사용할 수 있습니다.