新浦京81707con > 首页 > mvc框架打造笔记之wsgi协议的优缺点以及接口实现

原标题:mvc框架打造笔记之wsgi协议的优缺点以及接口实现

浏览次数:162 时间:2019-10-04

前言:

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

为了让我们越来越好的对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服务器的角度来讲,中间件扮演应用程序,而从应用程序的角度来说,中间件扮演服务器。“中间件”组件能够实施以下职能:

重写情况变量后,遵照目的UPRADOL,将呼吁音信路由到差异的选用对象。

允许在三个经过中况兼运维三个应用程序或接纳框架。

负载均衡和长距离管理,通过在网络上转账呼吁和响应音讯。

开展内容后甩卖,举例使用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,用来贯彻U奥迪Q5L 路由:(代码表达)

#!/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端:
[email protected]:~/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端:
[email protected]:~# curl http://192.168.2.163:8090/AA
AA page
[email protected]:~# curl http://192.168.2.163:8090/BB
BB page
[email protected]:~#

上面在给我们推荐一篇关机接口的详细介绍文章:深远分析Python中的WSGI接口

为了让大家更加好的对python中WSGI有更加好的敞亮,大家先从最简便的认知WSGI先河,然后介绍一下...

又是WSGI ,那是我早就相比熟识的商谈,此前针对落到实处了wsgi server的unicorn和uwsgi都写过源码分析的稿子。  其实她们的兑现也很轻松,就是给flask、django这样的application传递environ,start_response 。

澳门新萄京误乐 1

哪些是WSGI公约,什么是WSGI Server,他们的分别是如何?

上线的架构图很轻易误导他人,乍一看有nginx那样的web服务器,又有gunicorn这样的wsgi server。  大家先验证wsgi 跟 wsgi server的涉嫌,wsgi是个合同,是web底层跟application解耦的情商。wsgi server是团结做web服务器借用wsgi左券来调用application。 大家须要明显一点,nginx是敬敏不谢间接跟flask application做通讯,要求借用wsgi server。flask本人也是有个web服务器是werkzeug,so 技能开发银行服务并监听端口。记得从前uwsgi没人气的时候,大家都在动用apache mode_wsgi情势,apache也无法间接跟tornado通讯,是借用mod_wsgi把torando做成了unix socket服务,说白了也是运行了八个劳动,靠apache来转载。

nginx、apache在此处只是运营了proxy的职能,那干什么不直接把uwsgi和gunicorn给东窗事发出来,因为nginx的静态文件管理能力极强。

澳门新萄京误乐 2

WSGI怎么专门的学问的

wsgi首借使两层,服务器方 和 应用程序 :

1  服务器方:从底层深入分析http分析,然后调用应用程序,给应用程序提供(景况音信)和(回调函数), 那个回调函数是用来将应用程序设置的http header和status等消息传送给服务器方.

2  应用程序:用来变化再次来到的header,body和status,以便回到给劳务器方。

WSGI把来自socket的数据包分析为http格式,然后随即变化为environ变量,那environ变量里面有wsgi本人的音讯(比如host, post,进度形式等),还会有client的header及body新闻。start_respnse是贰个函调函数,必得求附带四个参数,三个是status(http状态),response_headers(响应的header头信息)。

像flask、django、tornado都会揭示WSGI合同入口,大家只要求和煦达成WSGI协议,wsgi server然后给flask传递environ,及start_response, 等到application再次来到值之后,作者再socket send再次来到客户端。

WSGI的优点、短处是如何?

优点:

多元的布置选用和组件之间的中度解耦

由于地点提到的冲天解耦天性,理论上,任何三个顺应WSGI标准的App都能够配备在任何二个贯彻了WSGI标准的Server上,那给Python Web应用的布局带来了偌大的灵活性。

本文由新浦京81707con发布于首页,转载请注明出处:mvc框架打造笔记之wsgi协议的优缺点以及接口实现

关键词: 新浦京81707con

上一篇:基本函数,THINKPHP中D方法调用逻辑层类

下一篇:没有了