什么是wsgi?

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

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

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:~#

上述示例是wsgi application的一个简单模型;

openstack中的wsgi application会涉及到几个比较重要的python 库

  1. eventlet.wsgi
  2. paste.deploy
  3. routes
  4. webob
  5. wsgiref.simple_server

开发一个OpenStack 风格的WSGI APP原型需要完成的几方面的工作:

  从配置文件中找到WSGI APP程序启动的入口,例如nova的api-paste.ini文件。 在/etc/nova/api-paste.ini

  定义好APP需要操作的资源,这儿我们主要是app的版本资源。

  完成好url到资源的映射。

 

  

python wsgi的更多相关文章

  1. Python 学习笔记13:Python + wsgi + django 配置。坑爹的python3和wsgi不兼容的解决

    今人不见古时月,今月曾经照古人.生命是如此的美丽与短暂! 学习Python已经两个月了,Python的语法通过做简单的语法题和看Python语法介绍,有了初步的了解.但上班还是要做别的事情,所以感觉学 ...

  2. 在Apache中运行Python WSGI应用

    我们介绍如何使用Apache模块mod_wsgi来运行Python WSGI应用. 安装mod_wsgi 我们假设你已经有了Apache和Python环境,在Linux或者Mac上,那第一步自然是安装 ...

  3. (转)python WSGI框架详解

    原文:https://www.cnblogs.com/shijingjing07/p/6407723.html?utm_source=itdadao&utm_medium=referral h ...

  4. python WSGI框架详解

    1.web应用的本质1)浏览器发送一个HTTP请求2)服务器收到请求,生成一个HTML文档3)服务器把HTML文档作为HTTP响应的body发个浏览器4)浏览器收到HTTP响应,从HTTP Body取 ...

  5. python - wsgi协议

    wsgi - python web server gateway interface 出现的目的是,为了在 python框架开发的时候,更具有通用性.只要符合 wsgi标准,就可以自由选择服务器(ng ...

  6. 对于python WSGI的理解

    首先看看WSGI的目的是什么? 是用来定义一个统一的接口. 这个接口是针对Web服务器和python Web应用之间的. 以增加Python web应用在不同Web 服务器之间的可移植性. 也就是说如 ...

  7. python wsgi 简介

    wsgi全称是"Web Server Gateway Interfacfe",web服务器网关接口,wsgi在python2.5中加入,是web服务器和web应用的标准接口,任何实 ...

  8. Python WSGI接口

    WSGI(Web Server Gateway Interface 或 Python Web Server Gateway Interface ),是为 Python 语言定义的 Web 服务器与 W ...

  9. python wsgi PEP333 中文翻译

    PEP 333 中文翻译 首先说明一下,本人不是专门翻译的,英文水平也不敢拿来献丑.只是这是两年前用python的时候为了自己学习方便而翻译的,记录着笔记自己看看而已.最近翻出来看看觉得还是放出来吧. ...

随机推荐

  1. Scala中的apply实战详解

    apply可以应用与Object和Class,单调用情景不一样. 通过Array(1,2,3,4,5) 可以调用到Array中的.appy方法.你可以看源码是如何实现apply的. 类中的appy比较 ...

  2. row_number() over (partition by....order by...)用法 分组排序

    row_number() over (partition by....order by...)用法 分组排序 row_number() OVER (PARTITION BY COL1 ORDER BY ...

  3. 编程珠玑I算法总结

    主要是根据编程珠玑后面的Algorithm附录总结了一下这本书里面的经典算法. 1 辗转相减求最大公约数 思想:最大公约数能整除i和j,则其一定也能整除i-j(if i>j) int gcd(i ...

  4. git Feature分支

    Feature分支 软件开发中,总有无穷无尽的新的功能要不断添加进来. 添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在 ...

  5. Unix/Linux环境C编程入门教程(4) Debian Linux环境搭建

    Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. 1.广义的Debian是指一个致力于创建自由操作系统的合作组织及其作品,由于Deb ...

  6. WISPr1.0

    王桢珍 王兵 侯志强 苑红 中国移动研究院 网络技术研究所, 北京100053 摘要   本文详细介绍了WLAN国际漫游的WISPr1.0技术规范并探讨其具体实现,包括基于WISPr1.0的WLAN国 ...

  7. VC6.0调试大全

    VC调试方法大全 一.调试基础 调试快捷键 F5: 开始调试 Shift+F5: 停止调试 F10:   调试到下一句,这里是单步跟踪  F11:   调试到下一句,跟进函数内部 Shift+F11: ...

  8. Web安全測试二步走

    Web安全測试时一个比較复杂的过程,软件測试人员能够在当中做一些简单的測试,例如以下: Web安全測试也应该遵循尽早測试的原则,在进行功能測试的时候(就应该运行以下的測试Checklist安全測试场景 ...

  9. Sicily 4495. Print permutations

    http://soj.me/4495 按字典序生成字符串的全排列 直接递归: #include <iostream> #include <string> #include &l ...

  10. BFC / hasLayout

    BFC - block formatting context 1.float的值不能为none 2.overflow的值不能为visible 3.display的值为table-cell,table- ...