Python的WSGI
2015-08-19 16:40
615 查看
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),协议定义了一套接口来实现服务器端与应用端通信的规范化(或者说是统一化)。
服务器端要做的也不复杂,就是对于每一个来访的请求,调用一次应用端“注册”的那个协议规定应用端必须要实现的对象,然后返回相应的响应消息。这样一次服务器端与应用端的通信也就完成了,一次对用户请求的处理也随之完成了!当然了,既然协议规定了服务器端在调用的时候要传递两个参数,自然也规定了这两个参数的一些细节。比如第一个参数其实就是一个字典对象,里面是所有从用户请求和服务器环境变量中获取的信息内容,协议当然会定义一些必须有的值,及这些值对应的变量名;第二个参数其实就是一个回调函数,它向应用端传递一个用来生成响应内容体的write对象,这个对象也是有__call__方法的。
协议也提到了,还可以设计中间件来连接服务器端与应用端,来实现一些通用的功能,比如session、routing等。
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”的字符串文本响应。这个例子虽然简单,但非常清楚的说明了应用端与服务器端的接口应用方式。
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。相关文章推荐
- python 精华之函数式编程
- python+flask+postgresql 学习
- Python中的tuple
- Python函数式编程指南(三):迭代器
- Python 使用正则表达式 - 1
- Python递归查找目录
- LeetCode:Sliding Window Maximum 题解 Python
- python文件小号单排。。。。(这局没打好。。。-25)
- 【转】Python调用C函数
- 64位win7下安装numpy,scipy,matplotlib
- Streaming+Python实现Itembased CF
- 学习python第一步,spyder开发环境的搭建
- Django 开发 Python Web应用
- python之路-----web应用的创建(python3.4下,django连接mysql)
- Python中如何创建文件夹和嵌套文件夹的方法
- Python——面向对象
- 03-树2. List Leaves (25) Python C
- wxPython+Boa Constructor环境配置
- Python数组排序
- wxpython 基本的控件 (文本)