Extension¶
Extension 페이지는 `ahttp_client`의 고유적인 기능은 벗어나지만, 개발에 도움이 될 수 있는 기능을 서술합니다.
다중 후킹(Mulitple Hooking)¶
여러 메소드에서 후킹을 할 수있도록 해주는 데코레이터 메소드 입니다. 일반적인 상황에서 ahttp_client 의 후킹 기능은 요청 전과 후로 하나의 메소드만 정의할 수 있습니다.
- @multiple_hook(hook, index)¶
이 데코레이터 메소드를 이용하여 HTTP 요청 전과 HTTP 요청 후의 후킹을 하나 이상 설정할 수 있습니다.
- 매개변수:
hook – hooking에 사용되는 데코레이터 함수가 입력됩니다.`RequestCore.before_hook()` 또는 RequestCore.after_hook() 가 될 수 있습니다.
index (Optional[int]) – 후킹 할 순서를 정의합니다.
Example
1class MetroAPI(Session): 2 def __init__(self, loop: asyncio.AbstractEventLoop): 3 super().__init__("https://api.yhs.kr", loop=loop) 4 5 @request("GET", "/metro/station") 6 async def station_search_with_query( 7 self, 8 response: aiohttp.ClientResponse, 9 name: Query | str 10 ) -> dict[str, Any]: 11 return await response.json() 12 13 @multiple_hook(station_search_with_query.before_hook) 14 async def before_hook_1(self, obj, path): 15 # Set-up before request 16 return obj, path 17 18 @multiple_hook(station_search_with_query.before_hook) 19 async def before_hook_2(self, obj, path): 20 # Set-up before request 21 return obj, path
Pydantic Response Model¶
참고
이 기능을 이용하기 위해서는 pydantic 패키지가 필요합니다.
pip install pydantic
json 형태로 반환받은 데이터를 직렬화하여, pydantic.BaseModel 에 확장된 데이터 클래스로 반환힙니다.
- @pydantic_response_model(model)¶
request method가 pydantic.BaseModel로 상속된 데이터 클래스로 반환할 수 있도록 만듭니다.
- 매개변수:
model (Optional[pydantic.BaseModel]) – API에서 불러온 값을 파싱할 pydantic.BaseModel 에 상속된 데이터 클래스입니다. 만약에 directly_response 기능이 켜져있고, model 인수가 값이 비어있다면, 반환 주석을 따라가게 설정될 것입니다.하지만, 반환 주석도 비어있다면 TypeError(“Invalid model type.”) 를 발생시킬 것입니다.
index (Optional[int]) – mulitple_hook 을 이용하여 데이터를 파싱할 순서를 정의합니다. 보통 HTTP 상태 코드를 확인하고, 마지막 과정에서 사용됩니다.
strict (Optional[bool]) – pydantic.BaseModel.model_validate 메소드의 strict 기능과 같은 기능을 합니다.
from_attributes (Optional[bool]) – pydantic.BaseModel.model_validate 메소드의 from_attributes 기능과 같은 기능을 합니다.
context (Optional[dict[str, Any]]) – pydantic.BaseModel.model_validate 메소드의 context 기능과 같은 기능을 합니다.
경고
이 기능은 실험적인 기능입니다. 예상대로 작동하지 않을 수도 있습니다. 그리고 pydantic 패키지를 설치해야합니다.
예제
>>> class ResponseModel(pydantic.BaseModel): ... name: str ... id: str ... >>> class MetroAPI(Session): ... def __init__(self, loop: asyncio.AbstractEventLoop): ... super().__init__("https://api.yhs.kr", loop=loop) ... ... @pydantic_response_model(ResponseModel) ... @request("GET", "/metro/station") ... async def station_search_with_query( ... self, ... response: aiohttp.ClientResponse, ... name: Query | str ... ) -> ResponseModel: ... pass