深入解析Python中的WSGI接口


Posted in Python onMay 11, 2015

概述

WSGI接口包含两方面:server/gateway 及 application/framework。
server调用由application提供的可调用对象。
另外在server和application之间还可能有一种称作middleware的中间件。
可调用对象是指:函数、方法、类或者带有callable方法的实例。
关于application

函数、方法、类及带有callable方法的实例等可调用对象都可以作为the application object。
WSGI协议要求:
the application object接受两个参数且可以被多次调用

这两个参数分别为:
1.CGI式的字典;
2.回调函数:application用来向server传递http状态码/消息/http头

另外协议要求可调用对象必须将响应体封装成一个可迭代的strings返回。

# the application object. 可以使用其他名字,
# 但是在使用mod_wsgi 时必须为 "application"
def application( environ, start_response):
# 函数接受两个参数:
# environ :包含有CGI 式环境变量的字典,由server负责提供内容
# start_response:由server提供的回调函数,其作用是将状态码和响应头返回给server

# 构造响应体,以可迭代字符串形式封装
  response_body = 'The request method was %s' % environ['REQUEST_METHOD']

# HTTP 响应码及消息
  status = '200 OK'

# 提供给客户端的响应头.
# 封装成list of tuple pairs 的形式:
# 格式要求:[(Header name, Header value)].
  response_headers = [('Content-Type', 'text/plain'),
            ('Content-Length', str(len(response_body)))]

# 将响应码/消息及响应头通过传入的start_reponse回调函数返回给server
  start_response(status, response_headers)

# 响应体作为返回值返回
# 注意这里被封装到了list中.
  return [response_body]

关于server

从概述中可以知道,WSGI server必须要调用application,同时,从application的协议要求可知:
1. WSGI server必须向application提供环境参数,因此,自身也必须能够获取环境参数。
2. WSGI server接收application的返回值作为响应体。
最简单的WSGI server为Python自带的wsgiref.simple_server
示例如下:

from wsgiref.simple_server import make_server
srv = make_server('localhost', 8080, hello_world)
srv.serve_forever()

关于middleware

middleware的概念没有appllication和server那么容易理解。
假设一个符合application标准的可调用对象,它接受可调用对象作为参数,返回一个可调用对象的对象。
那么对于server来说,它是一个符合标准的可调用对象,因此是application。
而对于application来说,它可以调用application,因此是server。
这样的可调用对象称为middleware。

middleware的概念非常接近decorator。

以一个路由的例子示例:

import re

# 这是一个标准的application object
def index(environ, start_response):
  start_response('200 OK', [('Content-Type', 'text/html')])
  return ['index page']

# 这是一个标准的application object
def hello(environ, start_response):
  start_response('200 OK', [('Content-Type', 'text/html')])
  return ['hello page']

# 这是一个标准的application object
def not_found(environ, start_response):
  start_response('404 NOT FOUND', [('Content-Type', 'text/plain')])
  return ['Not Found Page']

# map urls to functions
urls = [
  (r'^$', index),
  (r'hello/?$', hello)
]
# 这是一个middleware
# 根据不同的route返回不同的application object
def application(environ, start_response):
  path = environ.get('PATH_INFO', '').lstrip('/')
  for regex, callback in urls:
    match = re.search(regex, path)
    if match is not None:
Python 相关文章推荐
Python设计模式之代理模式实例
Apr 26 Python
python 开发的三种运行模式详细介绍
Jan 18 Python
python实现自动发送邮件发送多人、群发、多附件的示例
Jan 23 Python
用Python写脚本,实现完全备份和增量备份的示例
Apr 29 Python
pandas 条件搜索返回列表的方法
Oct 30 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
Jun 04 Python
python实现最大优先队列
Aug 29 Python
python绘制彩虹图
Dec 16 Python
使用Python串口实时显示数据并绘图的例子
Dec 26 Python
Python如何将模块打包并发布
Aug 30 Python
Pytorch如何切换 cpu和gpu的使用详解
Mar 01 Python
python实现批量提取指定文件夹下同类型文件
Apr 05 Python
详细解析Python中__init__()方法的高级应用
May 11 #Python
从Python的源码来解析Python下的freeblock
May 11 #Python
详解Python的Django框架中的templates设置
May 11 #Python
Python素数检测的方法
May 11 #Python
Python中IPYTHON入门实例
May 11 #Python
Python使用MONGODB入门实例
May 11 #Python
python学习数据结构实例代码
May 11 #Python
You might like
php购物网站支付paypal使用方法
2010/11/28 PHP
Symfony2实现从数据库获取数据的方法小结
2016/03/18 PHP
PHP使用DOM对XML解析处理操作示例
2019/07/04 PHP
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
JS特权方法定义作用以及与公有方法的区别
2013/03/18 Javascript
JS 实现点击a标签的时候让其背景更换
2013/10/15 Javascript
jQuery中scrollLeft()方法用法实例
2015/01/16 Javascript
jQuery实现带滚动导航效果的全屏滚动相册实例
2015/06/19 Javascript
基于jquery实现放大镜效果
2015/08/17 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
javascript 操作cookies详解及实例
2017/02/22 Javascript
微信小程序 五星评价功能的实现
2017/03/09 Javascript
WebSocket实现简单客服聊天系统
2017/05/12 Javascript
js定义类的方法示例【ES5与ES6】
2019/07/30 Javascript
使用原生JS实现火锅点餐小程序(面向对象思想)
2019/12/10 Javascript
[02:01]大师之路——DOTA2完美大师赛11月论剑上海
2017/11/06 DOTA
Python的批量远程管理和部署工具Fabric用法实例
2015/01/23 Python
Python二叉搜索树与双向链表转换实现方法
2016/04/29 Python
python如何把嵌套列表转变成普通列表
2018/03/20 Python
Python实现将Excel转换成xml的方法示例
2018/08/25 Python
详解Appium+Python之生成html测试报告
2019/01/04 Python
python实现两张图片的像素融合
2019/02/23 Python
详解Python下载图片并保存本地的两种方式
2019/05/15 Python
python将字符串list写入excel和txt的实例
2019/07/20 Python
keras.layer.input()用法说明
2020/06/16 Python
CSS3 实现发光边框特效
2020/11/11 HTML / CSS
SOKOLOV官网:俄罗斯珠宝首饰品牌
2021/01/02 全球购物
工厂门卫岗位职责
2013/11/25 职场文书
国际商务系学生个人的自我评价
2013/11/26 职场文书
毕业论文评语大全
2014/04/29 职场文书
安全口号大全
2014/06/21 职场文书
中国世界遗产导游词
2015/02/13 职场文书
文明礼仪倡议书
2015/04/28 职场文书
民间借贷借条范本
2015/05/25 职场文书
超市员工管理制度
2015/08/06 职场文书
外科护士长工作总结
2015/08/12 职场文书