- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 python 运行脚本,该脚本使用 urllib2 从天气 api 获取数据并将其显示在屏幕上。我遇到的问题是,当我查询服务器时,出现“没有与主机名关联的地址”错误。我可以用网络浏览器查看 api 的输出,我可以用 wget 下载文件,但我必须强制 IPv4 才能让它工作。使用 urllib2.urlopen 时是否可以在 urllib2 中强制使用 IPv4?
最佳答案
不直接,不。
那么,你能做什么?
一种可能是自己将主机名显式解析为 IPv4,然后使用 IPv4 地址而不是名称作为主机。例如:
host = socket.gethostbyname('example.com')
page = urllib2.urlopen('http://{}/path'.format(host))
但是,某些虚拟服务器站点可能需要 Host: example.com
header ,而它们将取而代之的是 Host: 93.184.216.119
。您可以通过覆盖 header 来解决此问题:
host = socket.gethostbyname('example.com')
request = urllib2.Request('http://{}/path'.format(host),
headers = {'Host': 'example.com'})
page = urllib2.urlopen(request)
或者,您可以提供自己的处理程序来代替标准处理程序。但标准处理程序大多只是 httplib.HTTPConnection
的包装器,真正的问题在于 HTTPConnection.connect
。
因此,干净的方法是创建您自己的 httplib.HTTPConnection
子类,它会像这样覆盖 connect
:
def connect(self):
host = socket.gethostbyname(self.host)
self.sock = socket.create_connection((host, self.post),
self.timeout, self.source_address)
if self._tunnel_host:
self._tunnel()
然后创建您自己的 urllib2.HTTPHandler
子类,覆盖 http_open
以使用您的子类:
def http_open(self, req):
return self.do_open(my wrapper.MyHTTPConnection, req)
……对于 HTTPSHandler
也是类似的,然后按照 urllib2
文档中所示正确连接所有内容。
做同样事情的快速而肮脏的方法是将 httplib.HTTPConnection.connect
monkeypatch 到上面的函数。
最后,您可以使用不同的库来代替 urllib2
。根据我的内存,requests
并没有使这变得更容易(最终,您必须重写或 monkeypatch 稍微不同的方法,但它实际上是相同的)。但是,任何 libcurl
包装器都允许您执行与 curl_easy_setopt(h, CURLOPT_IPRESOLVE, CURLOPT_IPRESOLVE_V4)
相同的操作。
关于Python urllib2 强制 IPv4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18007174/
目前部署在 Kubernetes 中的服务,通过 Calico BGP 将 Service 与集群外网络打通,并在外部的 nginx 中配置 Service 地址对外进行服务暴露。经过一段时间的观察
如发现here , 有一种新的 kube 服务是 IPVS 并且有很多负载均衡算法。 唯一的问题是我没有找到指定这些算法的位置。 我的理解: rr:循环法->循环调用后端pod lc:最少连接-> 将
我想尝试这种新的代理模式以及它为我们的一些应用程序提供的各种调度程序。到目前为止,我一直无法找到更改默认模式的方法 iptables至 ipvs在 GKE 节点上。 每个人都说通过--proxy-mo
我想在现有集群中为 IPVS 启用 Kube-proxy 模式。目前,它在 IPtables 上运行。如何在不影响现有工作负载的情况下将其更改为 IPVS? 我已经安装了所有必需的模块来启用它。另外,
我正在开发的应用程序作为 Kubernetes 集群中的部署运行。为此部署创建的 Pod 分布在集群中的各个节点上。我们的应用程序一次只能处理一个 TCP 连接,并且会拒绝进一步的连接。目前,我们使用
我是一名优秀的程序员,十分优秀!