Session 官网介绍的时候推荐采用同一个session做请求,可以自带很多的优势,比如keeplive,cookie等。 具体的可以看官网的内容:Advanced Client Usage — aiohttp 3.8.4 documentation
官网给出的session示例 官网示例地址:The aiohttp Request Lifecycle — aiohttp 3.8.4 documentation 对于session只有一点需要注意,那就是需要close
,可以手动关闭,也可以利用上下文管理的with
。
第一种 1 2 3 4 5 6 7 8 9 10 11 import aiohttpimport asyncioasync def main (): async with aiohttp.ClientSession() as session: async with session.get('http://python.org' ) as response: html = await response.text() print (html) loop = asyncio.get_event_loop() loop.run_until_complete(main())
第二种 第一种情况可以看到,对于单一的请求是可以的,但是对于多个请求未免有些烦琐,我们看官网给的第二种方式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 import aiohttpimport asyncioasync def fetch (session, url ): async with session.get(url) as response: return await response.text() async def main (): async with aiohttp.ClientSession() as session: html = await fetch(session, 'http://python.org' ) print (html) loop = asyncio.get_event_loop() loop.run_until_complete(main())
我们可以在main
函数中利用创建一个session来完成多次请求。 但是我们发现如果把session和我们的类相结合,上面的两种方式就都不是很友好,看github的issue作者是建议用构造函数来完成。
和项目相结合的方式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 from aiohttp import ClientResponse, ClientTimeoutfrom aiohttp_retry import RetryClient, ClientSessionclass Request : def __init__ (self, *args, **kwargs ): self.client_session = ClientSession(trust_env=False ) self.retry_client = RetryClient(client_session=self.client_session) self.request = self.retry_client.request(*args, **kwargs) async def __aenter__ (self ) -> ClientResponse: return await self.request async def __aexit__ (self, exc_type, exc_val, exc_tb ): await self.client_session.close() await self.retry_client.close() def request (method, url, params=None , headers=None , data=None , json=None ): if headers is None : headers = {} if params is None : params = {} if json is not None : return Request(method, url, params=params, headers=headers, ssl=False , json=json, timeout=ClientTimeout(total=100 )) else : return Request(method, url, params=params, headers=headers, data=data, ssl=False , timeout=ClientTimeout(total=100 ))
新建一个Request
的类,实现__aenter__
和__aexit__
两个方法,实例化类时新建一个session,请求完毕后关闭。
Enjoy! aiohttp是一个非常好玩的库,可以做client,也可以做server,对于个人项目来说非常的舒服,可以一把梭了。