如何在Python3的urllib或requests库中使用Unix Socket发起请求
实现方案
该需求可以实现,以下分别提供requests库和urllib库的实现方式。
方案1:使用requests库实现
requests原生不支持Unix套接字请求,需要先安装配套扩展包:pip install requests-unixsocket
代码示例:
import requests from requests_unixsocket import UnixAdapter # 创建会话对象 session = requests.Session() # 挂载Unix套接字适配器,指定Docker套接字路径 session.mount('http://localhost', UnixAdapter('/var/run/docker.sock')) # 发送请求,此处域名仅为符合HTTP格式要求,不会实际解析 response = session.get('http://localhost/images/json') # 打印返回的镜像列表 print(response.json())
方案2:使用urllib库实现
urllib不需要额外安装第三方包,可通过自定义Unix连接类实现:
import http.client import json # 自定义Unix套接字HTTP连接类 class UnixHTTPConnection(http.client.HTTPConnection): def __init__(self, socket_path, host='localhost', port=None, timeout=None, blocksize=8192): super().__init__(host, port, timeout, blocksize) self.socket_path = socket_path def connect(self): import socket self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self.sock.connect(self.socket_path) if self.timeout is not None: self.sock.settimeout(self.timeout) # 创建连接指定Docker套接字路径 conn = UnixHTTPConnection('/var/run/docker.sock') # 发送请求 conn.request('GET', '/images/json') # 读取并解析响应 response = conn.getresponse() data = json.loads(response.read().decode('utf-8')) print(data) # 关闭连接 conn.close()
注意事项
- 运行代码的用户需要持有
/var/run/docker.sock的读写权限,否则会触发权限报错,可通过将用户加入docker用户组或使用sudo运行代码解决。 - 请求中的域名仅为满足HTTP协议格式要求,不会实际进行DNS解析,填写任意合法域名均可正常运行。
内容的提问来源于stack exchange,提问作者Umar Draz
相关产品推荐
相关产品推荐

