戏说WSGI(Python Web服务网关接口)

当你在Python的世界中冒险,突然遭遇一只Web怪兽,你会选择什么武器对付它?在兵器谱上,下列兵器可谓名列前茅:

  • Zope,厚重的长枪。较早出现的武器形态。该武器非常之强悍,无坚不摧,无物不破。而且适合在军队中使用,排兵布阵集团作战效果更佳。然而要用好Zope要花上很长的时间,俗话说“月棍年刀一辈子枪”,可见其难度。
  • TurboGears,威武的刀。快意江湖必备之物。其打造者熟知江湖规矩,颇有武林盟主之风,遇事通常拉帮结伙,分派任务,决计不会把所有事情都揽在自己身上。
  • Django,飘逸的剑。非常内敛,据说使用该武器的高手通常是独行侠,他们的格言是:一剑在手,夫复何求?
  • Web.py,小巧的匕首,刺客的最爱。常被用来执行特殊任务。
  • pylons,诡异的鞭, 传言是Ruby世界的rails披上了Python的外衣,使用起来一定要小心,因为你不知道它会缠住敌人的脖子还是自己的脖子。

然而,我们今天要说的并不是这些武器,而是一种心法。毕竟武器的使用只是“招法”,而心法是招法的灵魂,心法一通,招法百通。这就是由马里奥创造的“管道心法”,西方大陆称其为WSGI(Python web服务网关接口)。

马里奥是一位水管工,常年钻在水管中苦心研究武术。马里奥发现,其实武器无所谓高下,最重要的是看使用武器的人和你要对付的对象。所谓一寸长,一份 强,如Zope威力强大,用来对付大型怪兽很合适,却难免滞重;而一寸短,一份险,如web.py在应付小型灵敏怪兽时有其独特优势。所以单单评论武器的 优劣根本是空泛之谈。于是乎,马里奥在水管中冥思苦想十余载,终于发现了适用于所有武器的心法。掌握此心法,使用任何武器都能游刃有余。由于马里奥是在水 管中受到了启发,故命名为“管道心法”。本文作者在游历时有幸发现此心法,并在“心内求法”上流传出来。传说上古时期的大神道格拉斯·麦克罗伊在参与创世时,曾经构筑了称为Pipeline的时空奇点,用以连接stdout和stdin。马里奥是否受此启发我们不得而知,但“管道心法”确实与此有类似之处:

WSGI是马里奥在探索管道的时候发现的一种连接件,它非常简单,入口处提供一个start_response,用于回流(回 调,callback),入口会连接到出口的一个函数,并传递environ字典和start_response作为参数;而出口处的函数先是调用 start_response并传递status和header,然后再返回content。由于这段心法有些拗口,马里奥演示了唯一的招式,并声明其实 所有的招式都可以从这招中演化出来:

def application(environ, start_response):     status = '200 OK'     response_headers = [('Content-type','text/plain')]     start_response(status, response_headers)     return ['Hello']

马里奥还发现,WSGI其实可以串联起来,为了区分,马里奥将下水管的入口叫做web server,只能接受外界的请求并调用下一段管件的函数;中间的管件叫做middleware,既可以接收上一段管件的请求,又可以调用下一段管件的函数;管道的终点叫做web app,只能被上一段管件调用。

为了避免后人误解,马里奥最后强调:武器是死的,好的武器只有在合适的人手里才能发挥最大的威力,争执于武器的好坏毫无意义。
马里奥最后将这段心法奉献给了PEP,PEP将其编号为333。

戏说WSGI(Python Web服务网关接口)--[转载]的更多相关文章

  1. WSGI——python web 服务器网关接口

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826084.html 一:服务器.服务器软件.应用程序(后台) 我们常说“服务器”,实际上服务器是一个很宽 ...

  2. Python Web 服务开发者: 第 1 部分

    Python Web 服务开发者: 第 1 部分 Python Web 服务世界 Python 的座右铭一向是“装备齐全”,这是指在安装该语言时会附带一大套标准库和功能程序.本文概述了在 Python ...

  3. 什么是 WSGI -- Python 中的 “CGI” 接口简介

    今天在 git.oschina 的首页上看到他们推出演示平台,其中,Python 的演示平台支持 WSGI 接口的应用.虽然,这个演示平台连它自己提供的示例都跑不起来,但是,它还是成功的勾起了我对 W ...

  4. 使用uwsgi 部署python web服务

    uwsgi, wsgi协议的一个很好的实现,源码在这里:https://github.com/unbit/uwsgi c语言编写,有兴趣可以研究下. 上DEMO: wsgi_server.py def ...

  5. Windows下搭建Apache+Django+Python Web服务环境

    最近在学Django,想用Apache搭建一个服务器环境,因此在网上看了好多资料,很多都是用Python2.6和Apache2.2搭建的环境,不过我还是想用Python35和Apache24来搭建,具 ...

  6. Nginx与python web服务配置(Uwsgi& FastCGI)

    Uwsgi start uswgi uwsgi --harakiri 360000 --body-read-warning=10000 --max-fd=65536 -b 1000000 --http ...

  7. Python web框架 flask

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  8. 一文读懂Python web框架和web服务器之间的关系

    我们都知道 Python 作为一门强大的语言,能够适应快速原型和较大项目的制作,因此被广泛用于 web 应用程序的开发中. 在面试的过程中,大家或多或少都被问到过这样一个问题:一个请求从浏览器发出到数 ...

  9. python web server gateway interface (wsgi ) notes

    前言: 注:如果需要得到支持批Python3.x以及包含了勘误表,附录,和说明的更新版规范,请查看PEP 3333 摘要: 这篇文档详细说明了一套在web服务器与Python web应用程序(web框 ...

随机推荐

  1. UML建模之活动图介绍(Activity Diagram)

      一.活动图的组成元素 Activity Diagram Element 1.活动状态图(Activity) 2.动作状态(Actions) 3.动作状态约束(Action Constraints) ...

  2. Objective-C priority queue

    http://stackoverflow.com/questions/17684170/objective-c-priority-queue PriorityQueue.h // // Priorit ...

  3. git命令使用方法

    git安装包 http://c35.yunpan.360.cn/my/?sid=#%2F%E5%AE%89%E8%A3%85%E5%8C%85%2FGit%E5%AE%89%E8%A3%85%2F g ...

  4. jQuery效果-淡入淡出

    本文实现一个控制出现.消失.透明度的效果 <!DOCTYPE html> <html> <head> <meta charset="UTF-8&qu ...

  5. JS瀑布流效果

    本篇内容实现类似百度图片的呈现功能,瀑布流+自动加载 index13.html <!DOCTYPE html> <html> <head> <meta cha ...

  6. 分布式内存对象缓存 memcached

    分布式内存对象缓存 许多Web 应用程序都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示.但随着数据量的增大,访问的集中,就会出现REBMS的负担加重,数据库响应恶化,网站显示延迟等 ...

  7. cURL中的超时设置

    访问HTTP方式很多,可以使用curl, socket, file_get_contents() 等方法. 在访问http时,需要考虑超时的问题. CURL访问HTTP: CURL 是常用的访问HTT ...

  8. Gson 基础教程 —— 自定义类型适配器(TypeAdapter)

    1,实现一个类型适配器(TypeAdapter) 自定义类型适配器需要实现两个接口: JsonSerializer<T> JsonDeserializer<T> 和两个方法: ...

  9. 转载:mybatis和hibernate 解析

    第一章     Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.net,现在已经成为Jboss的一部分. Mybatis 是另外一种优秀 ...

  10. JNI(5)The Invocation API

    调用API允许软件提供商加载Java VM 到任意的本地应用中.供应商可以提供支持Java的应用程序而无需链接Java VM的代码. 概述 下面代码展示了通过调用API如何使用函数.这个例子中C++代 ...