深入解析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 调用VC++的动态链接库(DLL)
Sep 06 Python
用Python编写一个基于终端的实现翻译的脚本
Apr 24 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
Jan 04 Python
使用python编写udp协议的ping程序方法
Apr 22 Python
Python 窗体(tkinter)按钮 位置实例
Jun 13 Python
Pandas中Series和DataFrame的索引实现
Jun 27 Python
TFRecord格式存储数据与队列读取实例
Jan 21 Python
Python实现队列的方法示例小结【数组,链表】
Feb 22 Python
浅析matlab中imadjust函数
Feb 27 Python
在Keras中利用np.random.shuffle()打乱数据集实例
Jun 15 Python
基于python实现图片转字符画代码实例
Sep 04 Python
python 网络编程要点总结
Jun 18 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打开文件fopen函数的使用说明
2013/07/05 PHP
PHP字符串中特殊符号的过滤方法介绍
2014/02/18 PHP
PHP中子类重载父类的方法【parent::方法名】
2016/05/06 PHP
thinkphp,onethink和thinkox中验证码不显示的解决方法分析
2016/06/06 PHP
PHP登录验证码的实现与使用方法
2016/07/07 PHP
PHP二维数组去重算法
2016/12/17 PHP
PHP多种序列化/反序列化的方法详解
2017/06/23 PHP
Javascript select控件操作大全(新增、修改、删除、选中、清空、判断存在等)
2008/12/19 Javascript
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
jquery ajax提交整个表单元素的快捷办法
2013/03/27 Javascript
如何使用jquery控制CSS样式,并且取消Css样式(如背景色,有实例)
2013/07/09 Javascript
如何判断鼠标是否在DIV的区域内
2013/11/13 Javascript
js加入收藏以及使用Jquery更改透明度
2014/01/26 Javascript
js电话号码验证方法
2015/09/28 Javascript
灵活的理解JavaScript中的this指向
2016/02/25 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
2018/08/10 Javascript
Python实现给qq邮箱发送邮件的方法
2015/05/28 Python
python实现闹钟定时播放音乐功能
2018/01/25 Python
python 按不同维度求和,最值,均值的实例
2018/06/28 Python
Python小白垃圾回收机制入门
2020/06/09 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
2020/08/07 Python
MAC平台基于Python Appium环境搭建过程图解
2020/08/13 Python
Matlab使用Plot函数实现数据动态显示方法总结
2021/02/25 Python
HTML5里autofocus自动聚焦属性使用介绍
2016/06/22 HTML / CSS
Hertz荷兰:荷兰和全球租车
2018/01/07 全球购物
俄罗斯运动鞋商店:Sneakerhead
2018/05/10 全球购物
廉价连衣裙和婚纱礼服在线销售:Tbdress
2019/02/28 全球购物
META-INF文件夹中的MANIFEST.MF的作用
2016/06/21 面试题
大学生毕业自荐信
2013/10/10 职场文书
幼儿教师自我鉴定
2013/11/02 职场文书
高中生国庆节演讲稿范文2014
2014/09/21 职场文书
党员群众路线自我剖析材料
2014/10/06 职场文书
文明旅游倡议书
2015/04/28 职场文书
运动会入场词
2015/07/18 职场文书
深入理解Vue的数据响应式
2021/05/15 Vue.js
Win11快速关闭所有广告推荐
2022/04/19 数码科技