23

here is my code:

import asyncio
from aiohttp import ClientSession


async def main():
    url = "https://stackoverflow.com/"

    async with ClientSession() as session:
        async with session.get(url) as resp:
            print(resp.status)

asyncio.run(main())

if I run it on my computer, everything works, but if I run it on pythonanywhere, I get this error:

Traceback (most recent call last):
  File "/home/0dminnimda/.local/lib/python3.8/site-packages/aiohttp/connector.py", line 936, in _wrap_create_connection
    return await self._loop.create_connection(*args, **kwargs)  # type: ignore  # noqa
  File "/usr/lib/python3.8/asyncio/base_events.py", line 1017, in create_connection
    raise exceptions[0]
  File "/usr/lib/python3.8/asyncio/base_events.py", line 1002, in create_connection
    sock = await self._connect_sock(
  File "/usr/lib/python3.8/asyncio/base_events.py", line 916, in _connect_sock
    await self.sock_connect(sock, address)
  File "/usr/lib/python3.8/asyncio/selector_events.py", line 485, in sock_connect
    return await fut
  File "/usr/lib/python3.8/asyncio/selector_events.py", line 517, in _sock_connect_cb
    raise OSError(err, f'Connect call failed {address}')
ConnectionRefusedError: [Errno 111] Connect call failed ('151.101.193.69', 443)
The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "test_c.py", line 39, in <module>
    asyncio.run(main())
  File "/usr/lib/python3.8/asyncio/runners.py", line 43, in run
    return loop.run_until_complete(main)
  File "/usr/lib/python3.8/asyncio/base_events.py", line 608, in run_until_complete
    return future.result()
  File "test_c.py", line 28, in main
    async with session.get(url, timeout=30) as resp:  # , headers=headers
  File "/home/0dminnimda/.local/lib/python3.8/site-packages/aiohttp/client.py", line 1012, in __aenter__
    self._resp = await self._coro
  File "/home/0dminnimda/.local/lib/python3.8/site-packages/aiohttp/client.py", line 480, in _request
    conn = await self._connector.connect(
  File "/home/0dminnimda/.local/lib/python3.8/site-packages/aiohttp/connector.py", line 523, in connect
    proto = await self._create_connection(req, traces, timeout)
  File "/home/0dminnimda/.local/lib/python3.8/site-packages/aiohttp/connector.py", line 858, in _create_connection
    _, proto = await self._create_direct_connection(
  File "/home/0dminnimda/.local/lib/python3.8/site-packages/aiohttp/connector.py", line 1004, in _create_direct_connection
    raise last_exc
  File "/home/0dminnimda/.local/lib/python3.8/site-packages/aiohttp/connector.py", line 980, in _create_direct_connection
    transp, proto = await self._wrap_create_connection(
  File "/home/0dminnimda/.local/lib/python3.8/site-packages/aiohttp/connector.py", line 943, in _wrap_create_connection
    raise client_error(req.connection_key, exc) from exc
aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host stackoverflow.com:443 ssl:default [Connect call failed ('151.101.193.69', 443)]
Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x7f25a71d1a90>

aiohttp on hosting:

Name: aiohttp
Version: 3.6.2
Summary: Async http client/server framework (asyncio)
Home-page: https://github.com/aio-libs/aiohttp
Author: Nikolay Kim
Author-email: fafhrd91@gmail.com
License: Apache 2
Location: /home/0dminnimda/.local/lib/python3.8/site-packages
Requires: chardet, async-timeout, multidict, yarl, attrs
Required-by: 

aiohttp on my PC:

Name: aiohttp
Version: 3.6.2
Summary: Async http client/server framework (asyncio)
Home-page: https://github.com/aio-libs/aiohttp
Author: Nikolay Kim
Author-email: fafhrd91@gmail.com
License: Apache 2
Location: c:\users\asus\appdata\roaming\python\python38\site-packages
Requires: async-timeout, attrs, chardet, yarl, multidict
Required-by: 

I am at a loss that it is not so? I am running both files using python3.8.

I also tried other urls, they have the same problem

Do I need to add any more details?

0dminnimda
  • 1,242
  • 3
  • 12
  • 29

6 Answers6

26

first solution

Referring to the help from the forum, I added trust_env = True when creating the client and now everything works.

Explanation: Free accounts on PythonAnywhere must use a proxy to connect to the public internet, but aiohttp, by default, does not connect to a proxy accessible from an environment variable.

Link to aiohttp documentation (look for a parameter called "trust_env")

Here is the new code:

import asyncio
from aiohttp import ClientSession


async def main():
    url = "https://stackoverflow.com/"

    async with ClientSession(trust_env=True) as session:
        async with session.get(url) as resp:
            print(resp.status)

asyncio.run(main())

solution if the first didn't help you

The domain you are trying to access must be in whitelist, otherwise you may also get this error.

In this case you need to post a new topic on the pythonanywhere forum asking to add the domain to the whitelist.
If this is an api, then you will need to provide a link to the documentation for this api.

0dminnimda
  • 1,242
  • 3
  • 12
  • 29
  • 1
    Seems we had different issues, my solution is related to SSL errors where the installed cert from certifi cannot be located by aiohttp. – jackotonye Mar 27 '21 at 21:58
  • @jackotonye, You can, in the same way as I am here, post your question and answer it right away. I think if someone encounters an error like yours, they will be glad to see your solution! (I will be glad to see it too) – 0dminnimda Mar 28 '21 at 07:57
  • @jackotonye if the error that you see itself (visually) does not differ much from the one presented in this question, than you shouldn't have deleted the answer, because it may be needed by others who stumble upon this question! – 0dminnimda Mar 28 '21 at 08:06
  • Yeah you're absolutely right I added the answer to a more related question Thanks https://stackoverflow.com/a/66842057/4584672 – jackotonye Mar 28 '21 at 13:46
12

If you are using Windows OS with python (3.8 or newer) and aiohttp (3.7.4 or older)
Sometimes the solution for an exception like ... Cannot connect to host <REQUESTED URL>:443 ssl:default [The parameter is incorrect] is:

import sys

...

policy = asyncio.WindowsSelectorEventLoopPolicy()
asyncio.set_event_loop_policy(policy)

asyncio.run(main())

And you can check your Python version and OS:

import sys

...

if (sys.platform.startswith('win')
        and sys.version_info[0] == 3
        and sys.version_info[1] >= 8):
    policy = asyncio.WindowsSelectorEventLoopPolicy()
    asyncio.set_event_loop_policy(policy)

asyncio.run(main())

here, in issue 4536, everything is described in more detail.

0dminnimda
  • 1,242
  • 3
  • 12
  • 29
  • Referring to issue 4636, the exception is `Cannot connect to host python.or g:443 ssl:default [The parameter is incorrect]` and not `Cannot connect to host stackoverflow.com:443 ssl:default [Connect call failed ('151.101.193.69', 443)]`, these are slightly different exceptions. You'd better create a question with exact traceback from issue and answer it. – 0dminnimda Apr 13 '21 at 11:12
  • Ok, but i think my text was more readeble – Alexandr Volodichev Apr 14 '21 at 14:47
3

set ssl to False when making the request

import aiohttp
conn = aiohttp.TCPConnector()

async with aiohttp.ClientSession(connector=conn) as session:
    await session.get('https://example.com', ssl=False)
Dennis
  • 110
  • 4
3

In my case the problem was a very big amount of simultaneously opened connections. To solve the problem I have passed a limit parameter to connector:

import aiohttp
conn = aiohttp.TCPConnector(limit_per_host=5)

async with aiohttp.ClientSession(connector=conn) as session:
Leo240
  • 766
  • 7
  • 16
2

From docs: https://docs.aiohttp.org/en/stable/client_reference.html, params of coroutine async-with request:

ssl – SSL validation mode. None for default SSL check (ssl.create_default_context() is used), False for skip SSL certificate validation, aiohttp.Fingerprint for fingerprint validation, ssl.SSLContext for custom SSL certificate validation. Supersedes verify_ssl, ssl_context and fingerprint parameters.

New in version 3.0.

import asyncio
from aiohttp import ClientSession


async def main():
    url = "https://stackoverflow.com/"

    async with ClientSession() as session:
        async with session.get(url, ssl=False) as resp:
            print(resp.status)

asyncio.run(main())
Serge
  • 1,416
  • 1
  • 15
  • 21
-10

I just solved what could have been a 3 hour problem in 5 mins by changing all https to http. If it's possible, don't use https. I had an issue where another library (playwright) could not use the selector event loop, I would have had to separate process to use aiohttp. Better yet, switch libraries, httpx is an okay alternative.

Lafftar
  • 145
  • 3
  • 11