当前位置: 首页 > 知识库问答 >
问题:

异步aiohttp请求失败,但同步请求成功

强阳曜
2023-03-14

下面的代码我得到不能连接到主机...: 443 ssl:真当我使用异步aiohttp.当我使用同步请求时,它成功了。

whitehouse.gov链接失败,但google.com在异步和同步情况下都成功。

出什么事了?这是在Python3.4中实现的。2在FreeBSD8上,aiohttp 0.14。4,请求2.5。3.

import asyncio
import aiohttp
import requests

urls = [
    'http://www.whitehouse.gov/cea/', 
    'http://www.whitehouse.gov/omb', 
    'http://www.google.com']


def test_sync():
    for url in urls:
        r = requests.get(url)
        print(r.status_code)


def test_async():
    for url in urls:
        try:
            r = yield from aiohttp.request('get', url)
        except aiohttp.errors.ClientOSError as e:
            print('bad eternal link %s: %s' % (url, e))
        else:
            print(r.status)


if __name__ == '__main__':
    print('async')
    asyncio.get_event_loop().run_until_complete(test_async())
    print('sync')
    test_sync()

此操作的输出为:

async
bad eternal link http://www.whitehouse.gov/cea: Cannot connect to host www.whitehouse.gov:443 ssl:True
bad eternal link http://www.whitehouse.gov/omb: Cannot connect to host www.whitehouse.gov:443 ssl:True
200
sync
200
200
200

共有3个答案

孙昂然
2023-03-14

不要使用此Answare,因为它可能等同于禁用证书检查。

正如Le Hibou在评论中指出的,ssl。意图CLIENT_AUTH用于在服务器端对客户端进行身份验证。

此值表示上下文可用于验证Web客户端(因此,它将用于创建服务器端套接字)。

查看create\u default\u context()的代码可以看出,在这种情况下,证书检查可能被禁用,或者至少是可选的。

我收到了相同的错误消息(在Windows上),并通过以下方法解决了此问题:

import aiohttp
import ssl


client = aiohttp.ClientSession()
client.post(
    'https://some.foo/bar/',
    json={"foo": "bar"},
    ssl=ssl.create_default_context(purpose=ssl.Purpose.CLIENT_AUTH))

这是使用请求()的ssl参数来设置不同于默认的SSL上下文。默认ssl.create_default_context()。

问题是ssl的默认值。创建默认上下文()是:

ssl.create_default_context(purpose=Purpose.SERVER_AUTH, cafile=None, capath=None, cadata=None)

的目的。在客户端验证服务器证书时,服务器身份验证似乎不起作用。相反,使用Purpose。作为客户端进行验证时,客户端验证

任文乐
2023-03-14

我在一个旧的Linux服务器上遇到了同样的问题,它的CA根证书已经过时,并且在SSLContext中加载证书CA包修复了这个问题。

import aiohttp
import ssl
import certifi

ssl_context = ssl.create_default_context(cafile=certifi.where())
async with aiohttp.ClientSession() as session:
    async with session.get('https://some.foo/bar/', ssl=ssl_context) as response:
        print(await response.text())
巢睿
2023-03-14

我怀疑您的机器上的证书验证链被破坏了。在Ubuntu上,一切都在工作,正如@dano所提到的。

无论如何,您可以通过创建自定义连接器实例来禁用ssl验证:

import asyncio
import aiohttp

urls = [
    'http://www.whitehouse.gov/cea/',
    'http://www.whitehouse.gov/omb',
    'http://www.google.com']


def test_async():
    connector = aiohttp.TCPConnector(verify_ssl=False)
    for url in urls:
        try:
            r = yield from aiohttp.request('get', url, connector=connector)
        except aiohttp.errors.ClientOSError as e:
            print('bad eternal link %s: %s' % (url, e))
        else:
            print(r.status)


if __name__ == '__main__':
    print('async')
    asyncio.get_event_loop().run_until_complete(test_async())

顺便说一句,请求库附带有自己的证书包。也许我们也需要为aiohttp做同样的事情?

UPD。另见https://github.com/aio-libs/aiohttp/issues/341

 类似资料:
  • 问题内容: 同步请求和异步请求之间的性能(速度方面)是否有差异? 使用异步请求的所有原因是什么? 问题答案: 您应该始终使用异步Ajax请求,实际上,我只知道应该使用同步Ajax请求的一个地方,即您是否在Ajax请求中,将新的JavaScript文件嵌入客户端,然后引用类型和/或原始Ajax请求返回的JavaScript文件中的对象。然后,应该(或可以理智地)通过使用同步Ajax请求包括对这个新J

  • 本文向大家介绍详解XMLHttpRequest(一)同步请求和异步请求,包括了详解XMLHttpRequest(一)同步请求和异步请求的使用技巧和注意事项,需要的朋友参考一下 XMLHttpRequest 让发送一个HTTP请求变得非常容易。你只需要简单的创建一个请求对象实例,打开一个URL,然后发送这个请求。当传输完毕后,结果的HTTP状态以及返回的响应内容也可以从请求对象中获取。  通过XML

  • 本文向大家介绍全面解析iOS中同步请求、异步请求、GET请求、POST请求,包括了全面解析iOS中同步请求、异步请求、GET请求、POST请求的使用技巧和注意事项,需要的朋友参考一下 先给大家分别介绍下iOS中同步请求、异步请求、GET请求、POST所代表的意思,然后在逐一通过实例给大家介绍。 1、同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进

  • 问题内容: 当我使用of方法时,和之间有什么区别? 问题答案: Mozilla开发人员:同步和异步请求 支持同步和异步通信。但是,一般而言,出于性能方面的考虑,异步请求应比同步请求优先。 简而言之,同步请求会阻止代码执行,并可能泄漏内存和事件。这可能会导致严重的问题。使用同步请求的唯一可行理由是更轻松地促进其中的下载。

  • 问题内容: 最新版本的Chrome是否已停止同步Ajax调用?进行同步Ajax调用时出现错误。我们更新到最新的Chrome版本-73.0.3683.103后,该问题突然出现。目前,同步调用在Firefox和IE上可以正常工作。我们正在错误以下 消息:“无法在’XMLHttpRequest’上执行’发送’:无法加载’Path …’:页面关闭时的同步XHR”。名称:“ NetworkError” 有人

  • 问题内容: 我尝试了python 请求库文档中提供的示例。 使用,我得到了响应代码,但是我想获得所请求的每个页面的内容。例如,这不起作用: 问题答案: 注意 下面的答案是不适用于请求v0.13.0 +。编写此问题后,异步功能已移至。但是,你可以将其替换为下面的内容,它应该可以工作。 我已经留下了这个答案,以反映原始问题,即有关使用请求的问题。 要异步执行多个任务,你必须: 为每个对象定义一个函数(