深入解析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登录pop3邮件服务器接收邮件的方法
Apr 30 Python
Python多进程机制实例详解
Jul 02 Python
在Python的Django框架中编写编译函数
Jul 20 Python
python中的编码知识整理汇总
Jan 26 Python
Python利用Beautiful Soup模块搜索内容详解
Mar 29 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
Mar 23 Python
Python中Numpy ndarray的使用详解
May 24 Python
python openpyxl使用方法详解
Jul 18 Python
python 通过邮件控制实现远程控制电脑操作
Mar 16 Python
30行Python代码实现高分辨率图像导航的方法
May 22 Python
python使用smtplib模块发送邮件
Dec 17 Python
Python lxml库的简单介绍及基本使用讲解
Dec 22 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 iconv() : Detected an illegal character in input string
2010/12/05 PHP
配置php网页显示各种语法错误
2013/09/23 PHP
JavaScript 拖拉缩放效果
2008/12/10 Javascript
jquery validate使用攻略 第四步
2010/07/01 Javascript
来自国外的14个图片放大编辑的jQuery插件整理
2010/10/20 Javascript
对xmlHttp对象方法和属性的理解
2011/01/17 Javascript
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
javascript-简单的计算器实现步骤分解(附图)
2013/05/30 Javascript
JavaScript实现三阶幻方算法谜题解答
2014/12/29 Javascript
javascript获取本机操作系统类型的方法
2015/08/13 Javascript
跟我学习javascript的函数调用和构造函数调用
2015/11/16 Javascript
基于JavaScript将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)
2015/12/28 Javascript
jQuery的实例及必知重要的jQuery选择器详解
2016/05/20 Javascript
javascript 将共享属性迁移到原型中去的实现方法
2016/08/31 Javascript
浅析如何利用angular结合translate为项目实现国际化
2016/12/08 Javascript
十大 Node.js 的 Web 框架(快速提升工作效率)
2017/06/30 Javascript
Javacript中自定义的map.js  的方法
2017/11/26 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
2018/04/21 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
2020/05/01 Javascript
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
[48:45]Ti4 循环赛第二日 NEWBEE vs EG
2014/07/11 DOTA
Python图像灰度变换及图像数组操作
2016/01/27 Python
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
2016/10/12 Python
Python 稀疏矩阵-sparse 存储和转换
2017/05/27 Python
python 将列表中的字符串连接成一个长路径的方法
2018/10/23 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
2019/01/08 Python
pip安装tensorflow的坑的解决
2020/04/19 Python
python 利用zmail库发送邮件
2020/09/11 Python
日本土著品牌,综合型购物网站:Cecile
2016/08/23 全球购物
小学学校门卫岗位职责
2014/08/03 职场文书
委托证明书
2014/09/17 职场文书
工作所在部门证明
2014/09/21 职场文书
抗洪救灾标语
2014/10/08 职场文书
体育教师个人总结
2015/02/09 职场文书
2015初中团委工作总结
2015/07/28 职场文书
Win11跳过联网界面创建本地管理账户的3种方法
2022/04/20 数码科技