Python WSGI简介
WSGI简介
应用程序端
服务器程序端
中间层
wsgiref包的简介
运行WSGI服务
1.WSGI简介
Python标准库支持网络通信,库中的一些模块能够实现基础的网络通信服务,如创建网络服务器、实现TCP/UDP层的通信、HTTP应用层的通信等。就比如SimpleHttpServer这个模块定义了简单的GET、HEAD、POST请求方法等HTTP通信服务。
Python标准库中关于网络通信的基本过程:创建一个服务器、创建请求处理程序,以WEB编程为例:
一个WEB应用包括了:
(1)浏览器发送一个HTTP请求
(2)服务器收到请求生成一个HTML文档
(3)服务器把HTML文档作为HTTP响应的body发送给浏览器
(4)浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示
面向http的python程序需要关心(具体了参考http请求、响应报文格式):
(1)请求
请求的方法method
请求的地址url
请求的内容
请求的头部header
请求的环境信息
(2)响应
状态码
响应的数据
响应的头部
将数据在http server和python程序之间简单友好地传递是复杂的。正确的做法是底层代码由专门的服务器软件实现,而用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以需要一个统一的中间件,提供给http server和python程序遵守的一定的规范,实现在网络的数据流和python的结构体之间的转换,让我们专心用Python编写Web业务,这就是WSGI的作用。
WSGI的全称是Web Server Gateway Interface。WSGI是一种规范,不是服务器、python模块、框架。定义了web server和web application两者进行通信的接口规范。 服务器端和应用端都必须遵循这套规范。当一个应用程序是按照WSGI规范开发的,那么它可以在任意遵循该规范的服务器上运行。
在WSGI的规范里,一个web服务流程得到了简化。wsgi把web组件分成三个部分:wsgi server (服务器端),wsgi middleware (中间件),wsgi application (应用端)。一个遵循WSGI规范的服务器工作逻辑很简繁,可以理解为从客户端接收一个请求,传递给应用程序,然后将应用返回的响应发送回客户端,这其中所有复杂的细节工作都交由接口另一侧的中间件或应用程序去完成。
Python 2.5及之后的版本都内置了一个WSGI服务器,这对于我们学习来说是非常方便的。
2.应用程序端Application
WSGI规定每个python程序(Application)必须是一个可调用的对象,要接受两个参数environ(WSGI环境信息)和start_response(开始响应请求的函数)。其中,environ是包含了环境信息的字典、Application内部在返回前调用start_response、start_response也必须接收两个必须的参数,即status(HTTP状态)和response_headers(响应消息的头)。
示例:
最简单的web版本的HelloWorld:
def application(environ, start_response):
start_response(‘200 OK’, [(‘Content-Type’, ‘text/html’)])
return [b’
4.中间层middleware
middleware做了两件事情:
(1)被服务器程序调用,返回结果回去
(2)调用应用程序,把参数传递过去
5.wsgiref包的介绍
wsgiref包为实现WSGI标准提供了一个参考,它可以作为独立的服务器测试和调试应用程序。wsgiref包含有以下模块:
·simple_server模块 ——simple_server模块实现了可以运行单个WSGI应用的简单的HTTP服务器。
·headers模块 ——管理响应首部的模块。
·handlers模块 ——符合WSGI标准的Web服务网关接口实现。该模块包含了一些处理程序对象,用来设置WSGI执行环境,以便应用程序能够在其他的Web服务器中运行。
·validate模块 ——“验证包装”模块,确保应用程序和服务器都能够按照WSGI标准进行操作。
·util模块 ——一些有用的工具集。
wsgiref源码地址:https://pypi.python.org/pypi/wsgiref
其中,simple_server模块实现了一个符合WSGI规范的WSGI Server和WSGI Application,直接调用API即可,可用make_server函数来创建服务器。
比如,
httpd = make_server(”, 8006, application)
httpd.serve_forever()
表示了make_server函数使用WSGIServer类构建符合WSGI规范的HTTP服务器,使用application作为一个Web应用。该函数返回一个服务器实例,并开始监听请求。
关闭服务器,使用server_close()方法。
比如,
httpd.server_close()
6.运行WSGI服务
有很多符合WSGI规范的服务器,我们可以挑选一个来用。但是现在,我们只想尽快测试一下我们编写的application()函数真的可以把HTML输出到浏览器,所以,要赶紧找一个最简单的WSGI服务器,把我们的Web应用程序跑起来。
好消息是Python内置了一个WSGI服务器,这个模块叫wsgiref,它是用纯Python编写的WSGI服务器的参考实现。
(1)先编写hello.py,实现web应用程序的WSGI处理函数
def application(environ, start_response):
start_response(‘200 OK’, [(‘Content-Type’, ‘text/html’)])
return [b’
from wsgiref.simple_server import make_server
from hello import application
httpd = make_server(’ ‘, 8000, application)
print(‘Serving HTTP on port 8000…’)
httpd.serve_forever()
如果主机在因特网上,同时将这个程序所用的端口号设置为80端口,即可实现互联网中其他的主机对此网站的访问。
(3)确保以上两个文件在同一个目录下,然后在cmd中先进入到该文件所属的路径(使用cd命令)。
然后用python解释器运行server.py文件:
python server.py
(4)在浏览器中输入
http://localhost:8000/
即可访问此网站