python中WSGI是什么,Python应用WSGI详解


Posted in Python onNovember 24, 2017

为了让大家更好的对python中WSGI有更好的理解,我们先从最简单的认识WSGI着手,然后介绍一下WSGI几个经常使用到的接口,了解基本的用法和功能,最后,我们通过实例了解一下WSGI在实际项目中如何使用。

WSGI是什么?

wsgi是一个web组件的接口防范,wsgi将web组件分为三类:web服务器,web中间件,web应用程序

wsgi基本处理模式为:wsgi Server -> wsgi middleware -> wsgi application

WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接口。自从 WSGI 被开发出来以后,许多其它语言中也出现了类似接口。

WSGI 的官方定义是,the Python Web Server Gateway Interface。从名字就可以看出来,这东西是一个Gateway,也就是网关。网关的作用就是在协议之间进行转换。

WSGI 是作为 Web 服务器与 Web 应用程序或应用框架之间的一种低级别的接口,以提升可移植 Web 应用开发的共同点。WSGI 是基于现存的 CGI 标准而设计的。

很多框架都自带了 WSGI server ,比如 Flask,webpy,Django、CherryPy等等。当然性能都不好,自带的 web server 更多的是测试用途,发布时则使用生产环境的 WSGI server或者是联合 nginx 做 uwsgi 。

也就是说,WSGI就像是一座桥梁,一边连着web服务器,另一边连着用户的应用。但是呢,这个桥的功能很弱,有时候还需要别的桥来帮忙才能进行处理。

WSGI的作用

WSGI有两方:“服务器”或“网关”一方,以及“应用程序”或“应用框架”一方。服务方调用应用方,提供环境信息,以及一个回调函数(提供给应用程序用来将消息头传递给服务器方),并接收Web内容作为返回值。

所谓的 WSGI中间件同时实现了API的两方,因此可以在WSGI服务和WSGI应用之间起调解作用:从WSGI服务器的角度来说,中间件扮演应用程序,而从应用程序的角度来说,中间件扮演服务器。“中间件”组件可以执行以下功能:

重写环境变量后,根据目标URL,将请求消息路由到不同的应用对象。

允许在一个进程中同时运行多个应用程序或应用框架。

负载均衡和远程处理,通过在网络上转发请求和响应消息。

进行内容后处理,例如应用XSLT样式表。

wsgi server:

理解为一个符合wsgi规范的web server,接收request请求,封装一系列环境变量,按照wsgi规范调用注册的wsgi app,最后将response返回给客户端。

工作流程:

1、服务器创建socket,监听port,等待client 连接

2、当请求过来时,server解析client msg放到环境变量environ中,并调用绑定的handler来处理

3、handler解析这个http请求,将请求消息例如method、path等放到environ中

4、wsgi handler再将一些server端消息也放到environ中,最后server msg,client msg,以及本次请求msg 全部都保存到了环境变量envrion中;

5、wsgi handler调用注册的wsgi app,并将envrion和回调函数传给wsgi app

6、wsgi app将reponse header/status/body回传给wsgi handler

7、handler 通过socket将response msg返回到client

WSGI Application

wsgi application就是一个普通的callable对象,当有请求到来时,wsgi server会调用这个wsgi app。这个对象接收两个参数,通常为environ,start_response。environ就像前面介绍的,可以理解为环境变量,

跟一次请求相关的所有信息都保存在了这个环境变量中,包括服务器信息,客户端信息,请求信息。start_response是一个callback函数,wsgi application通过调用start_response,将response headers/status 返回给wsgi server。此外这个wsgi app会return 一个iterator对象 ,这个iterator就是response body。

Dispatcher Middleware,用来实现URL 路由:(代码说明)

#!/usr/bin/python 
#encoding=utf-8

#利用wsgiref 作为wsgi server
from wsgiref.simple_server import make_server
"""
def simple_app(environ, start_response):
status = '200 ok'
response_headers = [('Content-type', 'text/plain')] #设置http头
start_response(status, response_headers)
return [u"test wsgi app".encode('utf-8')]

class AppClass(object):
def __call__(self, environ, start_response):
status = "200 ok"
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
return [u"class AppClass".encode('utf-8')]
"""

#wsgi app只要是一个callable对象即可,不一定要是函数
#一个实现了__call__方法示例也ok的

#httpd = make_server('', 8080, simple_app)
"""
app = AppClass()
httpd = make_server('', 8080, app)
httpd.serve_forever()
"""
URL_PATTERNS = (
('AA/', 'AA_app'),
('BB/', 'BB_app'),
)

class Dispatcher(object):
#实现路由功能:
def _match(self, path):
path = path.split('/')[1]
for url, app in URL_PATTERNS:
if path in url:
return app

def __call__(self, environ, start_response):
path = environ.get('PATH_INFO', '/')
app = self._match(path)
if app:
app = globals()[app]
return app(environ, start_response)
else:
start_response("404 NOT FOUND",[('Content-type', 'text/plain')])
return ["page dose not exists"]

def AA_app(environ, start_response):
start_response("200 OK",[('Content-type', 'text/html')])
return ["AA page"]

def BB_app(environ, start_response):
start_response("200 OK",[('Content-type', 'text/html')])
 return ["BB page"]

app = Dispatcher()
httpd = make_server('', 8090, app)
httpd.serve_forever()

测试结果:
server端:
root@u163:~/cp163/python# python wsgi_app.py 
192.168.2.162 - - [04/Nov/2015 18:44:06] "GET /AA HTTP/1.1" 200 7
192.168.2.162 - - [04/Nov/2015 18:44:22] "GET /BB HTTP/1.1" 200 7

client端:
root@u162:~# curl http://192.168.2.163:8090/AA
AA page
root@u162:~# curl http://192.168.2.163:8090/BB
BB page
root@u162:~#

下面在给大家推荐一篇关机接口的详细介绍文章:深入解析Python中的WSGI接口

Python 相关文章推荐
使用PDB模式调试Python程序介绍
Apr 05 Python
Python内存管理方式和垃圾回收算法解析
Nov 11 Python
python监控键盘输入实例代码
Feb 09 Python
详解python多线程、锁、event事件机制的简单使用
Apr 27 Python
用Python下载一个网页保存为本地的HTML文件实例
May 21 Python
Python查找最长不包含重复字符的子字符串算法示例
Feb 13 Python
python判断文件夹内是否存在指定后缀文件的实例
Jun 10 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
Apr 24 Python
浅谈Python里面None True False之间的区别
Jul 09 Python
详解Python3 定义一个跨越多行的字符串的多种方法
Sep 06 Python
python实现b站直播自动发送弹幕功能
Feb 20 Python
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
Apr 24 Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
Nov 24 #Python
Python内置函数——__import__ 的使用方法
Nov 24 #Python
Django中login_required装饰器的深入介绍
Nov 24 #Python
Python多进程库multiprocessing中进程池Pool类的使用详解
Nov 24 #Python
pip安装Python库时遇到的问题及解决方法
Nov 23 #Python
python清理子进程机制剖析
Nov 23 #Python
Python3 加密(hashlib和hmac)模块的实现
Nov 23 #Python
You might like
PHP5 安装方法
2007/01/15 PHP
php mssql 日期出现中文字符的解决方法
2009/03/10 PHP
删除无限分类并同时删除它下面的所有子分类的方法
2010/08/08 PHP
php程序总是提示验证码输入有误解决方案
2015/01/07 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
Jquery工作常用实例 使用AJAX使网页进行异步更新
2011/07/26 Javascript
js Array操作的最简短最容易理解方法
2013/12/09 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
javascript实现日期时间动态显示示例代码
2015/09/08 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
2016/04/07 Javascript
对Vue beforeRouteEnter 的next执行时机详解
2018/08/25 Javascript
Jquery的autocomplete插件用法及参数讲解
2019/03/12 jQuery
vue中实现上传文件给后台实例详解
2019/08/22 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
2020/01/21 Javascript
Python实现列表转换成字典数据结构的方法
2016/03/11 Python
Python 描述符(Descriptor)入门
2016/11/20 Python
Python反射用法实例简析
2017/12/22 Python
取numpy数组的某几行某几列方法
2018/04/03 Python
对python requests发送json格式数据的实例详解
2018/12/19 Python
Python根据欧拉角求旋转矩阵的实例
2019/01/28 Python
python3 map函数和filter函数详解
2019/08/26 Python
Python 3 使用Pillow生成漂亮的分形树图片
2019/12/24 Python
Python range与enumerate函数区别解析
2020/02/28 Python
10行Python代码实现Web自动化管控的示例代码
2020/08/14 Python
python 实现数据库中数据添加、查询与更新的示例代码
2020/12/07 Python
美国药妆网站:EDCskincare.com(防晒、痤疮、抗衰老等)
2017/04/28 全球购物
次世代生活态度:Hypebeast
2018/07/05 全球购物
某个公司的Java笔面试题
2016/03/11 面试题
2014信息技术专业毕业生自我评价
2014/01/17 职场文书
文明学生标兵事迹
2014/01/21 职场文书
生日寄语大全
2014/04/08 职场文书
初三学习计划书范文
2014/04/30 职场文书
舞蹈专业求职信
2014/06/13 职场文书
机关班子查摆问题及整改措施
2014/10/28 职场文书
2016年优秀团员事迹材料
2016/02/25 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书