Python的WSGI

来源:互联网 发布:苹果vip解析软件 编辑:程序博客网 时间:2024/05/16 05:03

WSGI不是框架不是模块,仅仅是一个规范协议,定义了一些接口,却影响着Python网络开发的方方面面。对于WSGI有这么一段定义:WSGI is the Web Server Gateway Interface.It is a specification for web servers and application servers to communicatewith web applications (though it can also be used for more than that),协议定义了一套接口来实现服务器端与应用端通信的规范化(或者说是统一化)。


Wsgi是怎样的一套接口呢?

应用端只需要实现一个接受两个参数的,含有__call__方法的,返回一个可遍历的含有零个或多个string结果的Python对象。码农都知道,传入参数的名字可以任意取,这里也不例外,但习惯把第一个参数命名为“environ”,第二个为“start_response”。

         服务器端要做的也不复杂,就是对于每一个来访的请求,调用一次应用端“注册”的那个协议规定应用端必须要实现的对象,然后返回相应的响应消息。这样一次服务器端与应用端的通信也就完成了,一次对用户请求的处理也随之完成了!当然了,既然协议规定了服务器端在调用的时候要传递两个参数,自然也规定了这两个参数的一些细节。比如第一个参数其实就是一个字典对象,里面是所有从用户请求和服务器环境变量中获取的信息内容,协议当然会定义一些必须有的值,及这些值对应的变量名;第二个参数其实就是一个回调函数,它向应用端传递一个用来生成响应内容体的write对象,这个对象也是有__call__方法的。

 

协议也提到了,还可以设计中间件来连接服务器端与应用端,来实现一些通用的功能,比如session、routing等。

 

实例

具体怎么应用这个协议呢?Python自带的wsgiref模块有个简单的例子:

fromwsgiref.simple_server import make_server 

 

defhello_world_app(environ, start_response): 

    status = '200 OK' # HTTP Status 

    headers = [('Content-type', 'text/plain')]# HTTP Headers 

    start_response(status, headers) 

 

    # The returned object is going to beprinted 

    return ["Hello World"] 

 

httpd= make_server('', 8000, hello_world_app) 

print"Serving on port 8000..." 

 

#Serve until process is killed 

httpd.serve_forever() 

这个例子更多体现的是应用端的开发方法,很简单的按照协议实现一个了满足规范的方法,这样当浏览器向本机8000端口发起一个请求时,就会得到一个“Hello World”的字符串文本响应。这个例子虽然简单,但非常清楚的说明了应用端与服务器端的接口应用方式。

 

服务器端如何运作

服务器开一个socket等待客户端连接;请求来了,服务器会读出传来的数据,然后根据HTTP协议做一些初步的封装,接着就可以调用事先注册的应用程序了,并将请求的数据塞进去;等响应处理完毕了再把数据通过socket发出去,over。

0 0
原创粉丝点击