使用现有套接字连接的Python“请求”
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用现有套接字连接的Python“请求”,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2522字,纯文字阅读大概需要4分钟。
内容图文
![使用现有套接字连接的Python“请求”](/upload/InfoBanner/zyjiaocheng/701/b5b9b8054f58498e9d198c03943e975b.jpg)
Python“请求”库目前风靡一时,因为它提供了用于发出HTTP请求的漂亮界面 – 但在它下面似乎有很多层间接 – 会话,HTTP适配器,最后是urllib3的机制.
如果我已经拥有一个打开的套接字,并希望使用“请求”在该套接字下发送HTTP响应并收到回复,那么在这个抽象堆栈中哪里是干预的正确位置?
如果没有某种干预(或自定义?),堆栈将尝试为我创建一个新的TCP / IP套接字,但在我的特定应用程序中,我的代码在代表我已建立连接之前不会被调用,所以我会如果我想能够使用请求的功能,需要说服请求在现有套接字上进行通话.
请求库:
http://pypi.python.org/pypi/requests
https://github.com/kennethreitz/requests
解决方法:
以下代码需要来自git的请求(尤其是requests.packages.urllib3.poolmanager.PoolManager._new_pool())
我使用ncat -v -l 127.0.0.1 8000测试了它
问题在于,连接不是由urllib3打开,而是由标准库中的httplib打开.
import socket
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3 import PoolManager, HTTPConnectionPool
try:
from http.client import HTTPConnection
except ImportError:
from httplib import HTTPConnection
class MyAdapter(HTTPAdapter):
def init_poolmanager(self, connections, maxsize):
self.poolmanager = MyPoolManager(num_pools=connections,
maxsize=maxsize)
class MyPoolManager(PoolManager):
def _new_pool(self, scheme, host, port):
# Important!
if scheme == 'http' and host == my_host and port == my_port:
return MyHTTPConnectionPool(host, port, **self.connection_pool_kw)
return super(PoolManager, self)._new_pool(self, scheme, host, port)
class MyHTTPConnectionPool(HTTPConnectionPool):
def _new_conn(self):
self.num_connections += 1
return MyHTTPConnection(host=self.host,
port=self.port,
strict=self.strict)
class MyHTTPConnection(HTTPConnection):
def connect(self):
"""Connect to the host and port specified in __init__."""
# Original
# self.sock = socket.create_connection((self.host, self.port),
# self.timeout, self.source_address)
# Important!
self.sock = my_socket
if self._tunnel_host:
self._tunnel()
if __name__ == '__main__':
import time
my_host = '127.0.0.1'
my_port = 8000
my_socket = socket.create_connection((my_host, my_port))
time.sleep(4)
s = requests.Session()
s.mount('http://', MyAdapter())
s.get('http://127.0.0.1:8000/foo')
编辑:
或直接monkeypatching连接池:
class MyHTTPConnection(HTTPConnection):
def connect(self):
self.sock = my_socket
if self._tunnel_host:
self._tunnel()
requests.packages.urllib3.connectionpool.HTTPConnection = MyHTTPConnection
if __name__ == '__main__':
my_host = '127.0.0.1'
my_port = 8000
my_socket = socket.create_connection((my_host, my_port))
requests.get('http://127.0.0.1:8000/foo')
内容总结
以上是互联网集市为您收集整理的使用现有套接字连接的Python“请求”全部内容,希望文章能够帮你解决使用现有套接字连接的Python“请求”所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。