python wsgi
什么是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 库
- eventlet.wsgi
- paste.deploy
- routes
- webob
- wsgiref.simple_server
开发一个OpenStack 风格的WSGI APP原型需要完成的几方面的工作:
从配置文件中找到WSGI APP程序启动的入口,例如nova的api-paste.ini文件。 在/etc/nova/api-paste.ini
定义好APP需要操作的资源,这儿我们主要是app的版本资源。
完成好url到资源的映射。
python wsgi的更多相关文章
- Python 学习笔记13:Python + wsgi + django 配置。坑爹的python3和wsgi不兼容的解决
今人不见古时月,今月曾经照古人.生命是如此的美丽与短暂! 学习Python已经两个月了,Python的语法通过做简单的语法题和看Python语法介绍,有了初步的了解.但上班还是要做别的事情,所以感觉学 ...
- 在Apache中运行Python WSGI应用
我们介绍如何使用Apache模块mod_wsgi来运行Python WSGI应用. 安装mod_wsgi 我们假设你已经有了Apache和Python环境,在Linux或者Mac上,那第一步自然是安装 ...
- (转)python WSGI框架详解
原文:https://www.cnblogs.com/shijingjing07/p/6407723.html?utm_source=itdadao&utm_medium=referral h ...
- python WSGI框架详解
1.web应用的本质1)浏览器发送一个HTTP请求2)服务器收到请求,生成一个HTML文档3)服务器把HTML文档作为HTTP响应的body发个浏览器4)浏览器收到HTTP响应,从HTTP Body取 ...
- python - wsgi协议
wsgi - python web server gateway interface 出现的目的是,为了在 python框架开发的时候,更具有通用性.只要符合 wsgi标准,就可以自由选择服务器(ng ...
- 对于python WSGI的理解
首先看看WSGI的目的是什么? 是用来定义一个统一的接口. 这个接口是针对Web服务器和python Web应用之间的. 以增加Python web应用在不同Web 服务器之间的可移植性. 也就是说如 ...
- python wsgi 简介
wsgi全称是"Web Server Gateway Interfacfe",web服务器网关接口,wsgi在python2.5中加入,是web服务器和web应用的标准接口,任何实 ...
- Python WSGI接口
WSGI(Web Server Gateway Interface 或 Python Web Server Gateway Interface ),是为 Python 语言定义的 Web 服务器与 W ...
- python wsgi PEP333 中文翻译
PEP 333 中文翻译 首先说明一下,本人不是专门翻译的,英文水平也不敢拿来献丑.只是这是两年前用python的时候为了自己学习方便而翻译的,记录着笔记自己看看而已.最近翻出来看看觉得还是放出来吧. ...
随机推荐
- C#递归树
protected void Page_Load(object sender, EventArgs e) { bindtree(PopId); } private void bindtree() { ...
- 轮播图插件myFocus使用
myFocus官网下载源码,本文是v2.0.1版,解压后如下 将js包内文件拷入工程 在工程内引入 <script src="js/myfocus-2.0.1.min.js" ...
- vs错误【C1083 C1854 C4727】的若干解决办法(对预编译文件头的解释)
这几天写程序,无意间把编译中间文件给删了,然后就出现了C1083编译错误. xxx.cpp ..\commen\xxx.cpp(2) : fatal error C1083: 无法打开预编译头文件:“ ...
- Java程序员快速入门Go语言
这篇文章帮助Java程序员快速入门Go语言. 转载至 开源中国社区. http://www.oschina.net 本文将以一个有代表性的例子为开始,以此让Java程序员对Go语言有个初步认识,随后将 ...
- linux中读写锁的rwlock介绍-nk_ysg-ChinaUnix博客
linux中读写锁的rwlock介绍-nk_ysg-ChinaUnix博客 linux中读写锁的rwlock介绍 2013-02-26 13:59:35 分类: C/C++ http://yaro ...
- HTML系列(八):表格
一.基本表格: 表格标记<table>,行标记<tr>,单元格标记<td> 基本语法: <table> <tr> <td>单元格 ...
- gridview中使用href调用javascript
传递参数(多个)可用以下两种方法: 方法一: <asp:TemplateField HeaderText="列名1"> <ItemTemplate> < ...
- Nio Client
public class NIOClient { static int SIZE = 2; final static int bufferSize = 500 * 1024; static InetS ...
- 锁·——lock关键字详解
作 者:刘铁猛 日 期:2005-12-25 关键字:lock 多线程 同步 小序 锁者,lock关键字也.市面上的书虽然多,但仔细介绍这个keyword的书太少了.MSDN里有,但所给的代码非常 ...
- A - A
A - A Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status ...