在请求框架中使用unix域套接字的正确方法是什么?

2024-05-12 18:07:15 发布

您现在位置:Python中文网/ 问答频道 /正文

通常,使用requests框架执行post请求是由以下人员完成的:

payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data=payload)

但是:如何连接到unix套接字而不是进行TCP连接?

在相关的说明中,如何在URL中编码域路径?

  • libcurl允许应用程序提供自己的套接字来执行请求
  • LDAP发明了自己的方案ldapi,其中套接字名称在主机字段中进行了%编码
  • httpie在主机字段中使用http+unix方案和%编码路径

这些都是一些例子,但是否有一个RFC或既定的最佳实践?


Tags: 路径框架http编码人员方案unixpost
3条回答

没有必要重新发明轮子:

https://github.com/msabramo/requests-unixsocket

URL方案是http+unix,socket路径被百分比编码到主机字段中:

import requests_unixsocket

session = requests_unixsocket.Session()

# Access /path/to/page from /tmp/profilesvc.sock
r = session.get('http+unix://%2Ftmp%2Fprofilesvc.sock/path/to/page')
assert r.status_code == 200

可以使用^{}创建TCP到UNIX的套接字代理,如下所示:

socat TCP-LISTEN:80,reuseaddr,fork UNIX-CLIENT:/tmp/foo.sock

然后将您的http请求发送到该代理。在UNIX套接字/tmp/foo.sock上侦听的服务器仍然必须理解HTTP,因为socat不执行任何消息转换。

请求没有现成的unix套接字实现。

但是您可以创建自定义的adapter,它将连接到unix套接字,发送请求并读取应答。

所有需要实现的方法都是.send().close(),这很简单。

在会话对象中注册适配器后,可以在UNIX传输中使用请求机器。

相关问题 更多 >