如何解决这种弃用警告?

时间:2019-08-16 04:39:48

标签: python aiohttp

我想要使用aiohttp的多个请求。 我正在像这样包装aiohttp,并且经过了这样的测试

我的代码

import asyncio
from aiohttp import ClientSession as AioClientSession


class ClientSession(AioClientSession):
    async def _get(self, session, url, params=None, **kwargs):
        async with session.get(url, params=params, **kwargs) as response:
            return await response.json()

    async def _post(self, session, url, data=None, **kwargs):
        async with session.post(url, data=data, **kwargs) as response:
            return await response.json()

    async def fetch_all(self, method, urls, loop, data=None, params=None, **kwargs):
        async with AioClientSession(loop=loop) as session:
            if method == "GET":
                results = await asyncio.gather(*[self._get(session, url, params=params, **kwargs) for url in urls])
            elif method == "POST":
                results = await asyncio.gather(*[self._post(session, url, data=data, **kwargs) for url in urls])
            else:
                assert False
            return results


def multi_requests_get(urls, params=None, **kwargs):
    session = ClientSession()
    loop = asyncio.get_event_loop()
    result = loop.run_until_complete(session.fetch_all("GET", urls, loop, params=params, **kwargs))
    session.close()
    return result


def multi_requests_post(urls, data=None, **kwargs):
    session = ClientSession()
    loop = asyncio.get_event_loop()
    result = loop.run_until_complete(session.fetch_all("POST", urls, loop, data=data, **kwargs))
    session.close()
    return result

测试代码

urls = ["https://httpbin.org/get?{}={}".format(x, x) for x in range(10)]

result = multi_requests_get(urls=urls)

assert result
assert result[0]["args"] == {"0": "0"}
assert result[1]["args"] == {"1": "1"}

但是此测试返回警告:

The object should be created from async function
    loop=loop)

如何避免此警告?

这是完整的追溯

============================================================================= warnings summary ==============================================================================
base/tests/test_aiohttp.py::AioHttpTest::test_get
  /path/server/base/requests.py:122: DeprecationWarning: The object should be created from async function
    session = ClientSession()

base/tests/test_aiohttp.py::AioHttpTest::test_get
base/tests/test_aiohttp.py::AioHttpTest::test_post
  /env_path/lib/python3.6/site-packages/aiohttp/connector.py:730: DeprecationWarning: The object should be created from async function
    loop=loop)

base/tests/test_aiohttp.py::AioHttpTest::test_get
base/tests/test_aiohttp.py::AioHttpTest::test_post
  /env_path/lib/python3.6/site-packages/aiohttp/connector.py:735: DeprecationWarning: The object should be created from async function
    resolver = DefaultResolver(loop=self._loop)

base/tests/test_aiohttp.py::AioHttpTest::test_get
base/tests/test_aiohttp.py::AioHttpTest::test_post
  /env_path/lib/python3.6/site-packages/aiohttp/cookiejar.py:55: DeprecationWarning: The object should be created from async function
    super().__init__(loop=loop)

base/tests/test_aiohttp.py::AioHttpTest::test_get
  /path/darae/server/base/requests.py:125: RuntimeWarning: coroutine 'ClientSession.close' was never awaited
    session.close()

base/tests/test_aiohttp.py::AioHttpTest::test_post
  /path/server/base/requests.py:131: DeprecationWarning: The object should be created from async function
    session = ClientSession()

base/tests/test_aiohttp.py::AioHttpTest::test_post
  /path/server/base/requests.py:134: RuntimeWarning: coroutine 'ClientSession.close' was never awaited
    session.close()

-- Docs: https://docs.pytest.org/en/latest/warnings.html
=================================================================== 2 passed, 10 warnings in 1.93 seconds ===================================================================

2 个答案:

答案 0 :(得分:1)

aiohttp.ClientSession类必须在协程函数中实例化,而不仅仅是一个函数。
您需要做的所有事情:
1.从ClientSession中删除父类-您已经在fetch_all中显式使用了它,并且不再需要它。
2.删除对session.close()的调用-会话DO由上下文管理器在fetch_all中自动关闭。

答案 1 :(得分:1)

您可以查看来自 here 的简单工作示例并找到放置您的 aiohttp.ClientSession() as client 的位置:

import aiohttp
import asyncio

async def fetch(client):
  async with client.get('http://python.org') as resp:
    assert resp.status == 200
    return await resp.text()

async def main():
  async with aiohttp.ClientSession() as client:
    html = await fetch(client)
    print(html)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
相关问题