深入解析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创建列表并给列表赋初始值的方法
Jul 28 Python
基于python的Tkinter实现一个简易计算器
Dec 31 Python
python Django框架实现自定义表单提交
Mar 25 Python
python中子类调用父类函数的方法示例
Aug 18 Python
PyQt5利用QPainter绘制各种图形的实例
Oct 19 Python
kafka-python批量发送数据的实例
Dec 27 Python
python导入pandas具体步骤方法
Jun 23 Python
django之静态文件 django 2.0 在网页中显示图片的例子
Jul 28 Python
Python unittest工作原理和使用过程解析
Feb 24 Python
什么是Python变量作用域
Jun 03 Python
Python用Jira库来操作Jira
Dec 28 Python
一篇文章搞懂python混乱的切换操作与优雅的推导式
Aug 23 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
用mysql触发器自动更新memcache的实现代码
2009/10/11 PHP
浅析Yii2中GridView常见操作
2016/04/22 PHP
PHP生成随机密码4种方法及性能对比
2020/12/11 PHP
Javascript 两个窗体之间传值实现代码
2009/09/25 Javascript
javascript 打开页面window.location和window.open的区别
2010/03/17 Javascript
检测jQuery.js是否已加载的判断代码
2011/05/20 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
JavaScript实现单击下拉框选择直接跳转页面的方法
2015/07/02 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
详解AngularJS ui-sref的简单使用
2017/04/24 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
ES6扩展运算符的用途实例详解
2017/08/20 Javascript
基于vue-cli vue-router搭建底部导航栏移动前端项目
2018/02/28 Javascript
vue如何通过id从列表页跳转到对应的详情页
2018/05/01 Javascript
详解搭建es6+devServer简单开发环境
2018/09/25 Javascript
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
2020/02/24 Javascript
python中的随机函数小结
2018/01/27 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
2018/11/10 Python
详解Python 定时框架 Apscheduler原理及安装过程
2019/06/14 Python
使用Python为中秋节绘制一块美味的月饼
2019/09/11 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
大家都说好用的Python命令行库click的使用
2019/11/07 Python
python如何爬取网页中的文字
2020/07/28 Python
python logging模块的使用详解
2020/10/23 Python
基于 HTML5 WebGL 实现的垃圾分类系统
2019/10/08 HTML / CSS
Herschel Supply Co.美国:背包、手提袋及配件
2020/11/24 全球购物
三查三看党性分析材料
2014/02/18 职场文书
环境卫生倡议书
2014/08/29 职场文书
党的群众路线教育实践活动党员个人剖析材料
2014/10/08 职场文书
搞笑婚前保证书
2015/02/28 职场文书
高考诚信考试承诺书
2015/04/29 职场文书
金正昆讲礼仪观后感
2015/06/11 职场文书
小学运动会入场口号
2015/12/24 职场文书
python使用torch随机初始化参数
2022/03/22 Python