下面的代码我得到不能连接到主机...: 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
不要使用此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。作为客户端进行验证时,客户端验证
。
我在一个旧的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())
我怀疑您的机器上的证书验证链被破坏了。在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 +。编写此问题后,异步功能已移至。但是,你可以将其替换为下面的内容,它应该可以工作。 我已经留下了这个答案,以反映原始问题,即有关使用请求的问题。 要异步执行多个任务,你必须: 为每个对象定义一个函数(