我跟踪了一下,跟踪到了
`urllib3.util.connection.create_connection`
这个函数里面。
这个函数做的是根据 host 和 port 建立 socket 连接。当使用 localhost 的时候,会调用
`for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM)`
这样一个循环。对于 `localhost`,会返回两个结果:
+ ::1 (ipv6 下的 localhost)
+ 127.0.0.1 (ipv4 下的 localhost)
根据循环,会首先尝试连接 `::1`,而如果 flask 使用的是默认的 host 或是 0.0.0.0,只会监听 ipv4 的请求,因此 ipv6 会抛出 NewConnectionError,而后继续尝试 ipv4 的请求。这就是两秒延迟的原因。
解决方法:
+ 使用
app.run(host='::') 调试,使 flask 监听 ipv6,这样第一个尝试的 `::1` 也可以正常连接。
+ 使用 requests.get('127.0.0.1'), 避免 DNS 解析。