WSGI简介
Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。标准的接口很容易支持许多不同的Web服务器应用程序的WSGI。只有Web服务器和编程框架的开发者需要知道的WSGI设计的细节。通常只需要安装WSGI应用或使用现有的框架编写的Web应用程序。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。
以前,如何选择合适的Web应用程序框架成为困扰Python初学者的一个问题,这是因为,一般而言,Web应用框架的选择将限制可用的Web服务器的选择,反之亦然。那时的Python应用程序通常是为CGI,FastCGI,mod_python中的一个而设计,甚至是为特定Web服务器的自定义的API接口而设计的。
WSGI[1](有时发音作'wiz-gee')是作为Web服务器与Web应用程序或应用框架之间的一种低级别的接口,以提升可移植Web应用开发的共同点。WSGI是基于现存的CGI标准而设计的。
WSGI有两方:“服务器”或“网关”一方,以及“应用程序”或“应用框架”一方。服务方调用应用方,提供环境信息,以及一个回调函数(提供给应用程序用来将消息头传递给服务器方),并接收Web内容作为返回值。
所谓的 WSGI中间件同时实现了API的两方,因此可以在WSGI服务和WSGI应用之间起调解作用:从WSGI服务器的角度来说,中间件扮演应用程序,而从应用程序的角度来说,中间件扮演服务器。“中间件”组件可以执行以下功能:
重写环境变量后,根据目标URL,将请求消息路由到不同的应用对象。
允许在一个进程中同时运行多个应用程序或应用框架。
负载均衡和远程处理,通过在网络上转发请求和响应消息。
进行内容后处理,例如应用XSLT样式表。
wsgiref简介
快速入门
安装
# pip install urllib3
使用
>>> import urllib3
>>> http = urllib3.PoolManager()
>>> r = http.request('GET', 'http://google.com/')
>>> r.status
200
>>> r.headers['server']
'gws'
>>> r.data
...
组件
urllib3在能力、扩展性和sanity之间有很好的平衡。代码库是可重用的实用工具,抽象组合在一起形成一些有用的层。
PoolManager
最高层是PoolManager(...)。
PoolManager会在请求同一台主机时重用连接,这适合多数场景且不会严重丢失效率,当然你也可以在底层进行更细粒度的控制。
>>> import urllib3
>>> http = urllib3.PoolManager(10)
>>> len(http.pools)
0
>>> r1 = http.request('GET', 'http://automationtesting.sinaapp.com/blog')
>>> len(http.pools)
1
>>> r2 = http.request('GET', 'http://automationtesting.sinaapp.com/blog/m_urllib3')
>>> len(http.pools)
1
>>> r3 = http.request('GET', 'http://urllib3.readthedocs.org/en/latest/')
>>> len(http.pools)
2
PoolManager是的ConnectionPool对象集的代理。他们都继承自RequestMethods,以确保API类似。
ProxyManager
ProxyManager是PoolManager的HTTP代理识别子类。它为所有HTTP连接生成单个HTTPConnectionPool实例,为HTTPS连接生成单个per-server:portdeHTTPSConnectionPool实例。
>>> proxy = urllib3.ProxyManager('http://localhost:3128/')
>>> r1 = proxy.request('GET', 'http://google.com/')
>>> r2 = proxy.request('GET', 'http://httpbin.org/')
>>> len(proxy.pools)
1
>>> r3 = proxy.request('GET', 'https://httpbin.org/')
>>> r4 = proxy.request('GET', 'https://twitter.com/')
>>> len(proxy.pools)
3
2
ConnectionPool
HTTPConnectionPool和HTTPSConnectionPool类允许为单个主机定义的连接池,该连接池可以自动重用连接并是线程安全的。
当SSL模块是可用时,那么HTTPSConnectionPool对象检查SSL证书。
>>> conn = urllib3.connection_from_url('http://www.google.com.hk')
>>> r1 = conn.request('GET', 'http://www.google.com.hk/')
>>> r2 = conn.request('GET', '/search')
>>> r3 = conn.request('GET', 'http://wwww.yahoo.com/')
Traceback (most recent call last):
File "", line 1, in
File "/usr/lib/python2.7/site-packages/urllib3/request.py", line 75, in request
**urlopen_kw)
File "/usr/lib/python2.7/site-packages/urllib3/request.py", line 88, in request_encode_url
return self.urlopen(method, url, **urlopen_kw)
File "/usr/lib/python2.7/site-packages/urllib3/connectionpool.py", line 530, in urlopen
raise HostChangedError(self, url, retries - 1)
urllib3.exceptions.HostChangedError: HTTPConnectionPool(host='www.google.com.hk', port=None): Tried to open a foreign host with url: http://wwww.yahoo.com/
ConnectionPool是连接到特定主机的池。试图在池中访问汽提塔主机将引发HostChangedError异常,除非你设置assert_same_host=False。
如果你需要访问多个主机单不希望管理ConnectionPool,就需要PoolManager。
ConnectionPool是由httplib.HTTPConnection集组成。
Foundation
Notes
SSL/TLS的压缩在Python3.2+因为CRIME attack默认禁用。在Python 2中使用pyOpenSSL的contrib模块也可以禁用,但这需要额外的依赖,并可能对PyOpenSSL产生副作用。
本文地址