WSGI Python Web Server Gateway Interface 规范学习

由于Python的灵活性,提供了多种方式可以作为服务端语言,包括Python编写的服务器(Medusa)、Python处理模块(mod_python),或者使用CGI、FastCGI方式触发Python脚本。 为了能够编写更通用的Web端程序,提出了WSGI接口作为标准接口规范,类似于Java中的Serverlet,一旦编写完成后,可以运行在不同的App框架中。

WSGI接口涉及两个方面:一面是:服务器(server)或网关(gateway),相对别一面是:应用程序(application)或框架(framework)。服务端运行由应用程或框架提供的可执行的对像实例,至于这个可执行对象的是如果获得的细节,不在WSGI规范定义之内,而是同server或gataway去处理。

Application/Framework 端

Application端是一个callable term,可以是function、class、method等,接收两个参数environ、start_response。当application被server调用时,必须返回一个iterable的bytestrings或者是zero(可以使用yield返回一个生成器)。

WSGI 是为框架或服务器开发人员提供的工具,而不是为应用人员提供的。

When called by the server, the application object must return an iterable yielding zero or more byte strings.

服务器调用时,应当以无缓存的形式将产生的内容发送给客户端。

方法:len()、close()

Server/Gateway 端

中间件 Middleware 扮演两个角色

Middleware常扮演以下角色:

  • 根据目标URL将请求路由到不同的Application进行处理
  • 允许多个Application或Framework运行在相同的进程中
  • 通过网络内的请求转发实现负载均衡和远程处理
  • 实现内容的后续处理,例如XSL样式表

中间件的存在对于服务端和应用端应该都是透明的。

environ 变量

environ 是一个字典变量。

变量名 备注
REQUEST_METHOD HTTP请求方法,GET、POST、PUT,不能为空
SCRIPT_NAME 脚本名称,可以为空
PATH_INFO 请求URL中的一部分,可以为空
QUERY_STRING 请求URL中问号(?)之后的部分,可以为空
CONTENT_TYPE 请求中的Content_Type字段,可以为空
CONTENT_LENGTH 请求中的Content_Length,可以为空
SERVER_NAME , SERVER_PORT 不能为空
SERVER_PROTOCOL 客户端发送请求采用的协议及版本
HTTP_ 变量 客户端请求头中的参数,可以为空

CGI方式需要提供的参数略有不同,具体可以参考PEP3333

A WSGI-compliant server or gateway should document what variables it provides, along with their definitions as appropriate. Applications should check for the presence of any variables they require, and have a fallback plan in the event such a variable is absent.

Input、Error流

服务器端必须支持以下几个方法

方法 流
read(size) Input
readline() Input
readlines(hint) Input
iter() Input
flush() errors
write(str) errors
writelines(seq) errors

start_response()

方法示例start_response(status, response_headers, exec_info = None)。

start_response 接收两个参数start_response(status, response_headers),status是状态返回信息,诸如“200 OK”或者“404 Not Found”,纯文本,不能包含任何控制符号。response_headers是一个形如(header_name, header_value)的tuples,必须是Python的List。header_name必须是RFC2616中定义的名称,header_value不包含结束符号及任何控制符号,包括换行等。

一般来说,服务器端负责确保发送的header的正确性,如果应用忽略了某个http头参数,那么服务器应该给补充进去。

服务端应该检查是否向客户端发送了保持链接的头参数,如果发现,应该抛出错误。

Content-Length 头的处理

如果应用端提供了 Content-Length 请求头,服务端不应当传递超过这个长度的内容。处理方式是停止发送内容,或产生一个报错。如果没有提供足够的内容,则应正常关闭链接不产生错误。

如果没有提供 Content-Length 头,则服务端可以自己决定采用哪种处理方式,最简单的就是响应结束后关闭链接。某些情况下,服务端可以自己产生 Content-Length , 或者尽量避免关闭链接。如果服务端和客户端都支持 HTTP/1.1 分块编码,则服务端需要为每个块提供一个 Content-Length。

缓存和流处理 Buffering and Streaming

write() callable

一些编程框架提供了缓存的 write() 函数以及一个 flush() 函数,用于刷新缓存,但是很遗憾标准的WSGI无法实现这个需求。但WSGI仍提供了一个特殊 write() 函数,来实现这些迫切的需求。

write() 由 start_response 返回,接收一个参数。一个应用必须返回一个 iterable 对象。

错误处理

Python3.6学习笔记(六)的更多相关文章

  1. python3.4学习笔记(六) 常用快捷键使用技巧,持续更新

    python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...

  2. python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码

    python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...

  3. python3.4学习笔记(十六) windows下面安装easy_install和pip教程

    python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...

  4. python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑

    python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件?当我们点开下载页时, 一般 ...

  5. python3.4学习笔记(四) 3.x和2.x的区别,持续更新

    python3.4学习笔记(四) 3.x和2.x的区别 在2.x中:print html,3.x中必须改成:print(html) import urllib2ImportError: No modu ...

  6. python3.4学习笔记(十七) 网络爬虫使用Beautifulsoup4抓取内容

    python3.4学习笔记(十七) 网络爬虫使用Beautifulsoup4抓取内容 Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖 ...

  7. python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容

    python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI,采用Python语言编写 ...

  8. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  9. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  10. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

随机推荐

  1. 国内最火的 HTML、CSS、JavaScript 开源项目 Top 榜,你知多少?

    对于开发者而言,想要着手前端开发,HTML.CSS 和 JavaScript 是三项必备的基础技能.而如何事半功倍地掌握好这些知识?通过了解当下火热的开源项目不乏为最佳学习姿势.本文盘点国内评分最高且 ...

  2. TradingView 为 k 线柱添加标记

    看别人翻译的开发文档: 开发文档地址:https://zlq4863947.gitbooks.io/tradingview/ getMarks(symbolInfo, startDate, endDa ...

  3. 导出Excel超过65535条限制解决方案

    使用poi导出excel的时候如果数据过多,超过65535条会报错,因为excel2003一个sheet表最多导出65535条,excel2007是10万4000多条限制. 因此遇到这种excel导出 ...

  4. 数据准备<4>:变量筛选-理论篇

    在上一篇文章<数据准备<3>:数据预处理>中,我们提到降维主要包括两种方式:基于特征选择的降维和基于维度转换的降维,其中基于特征选择的降维通俗的讲就是特征筛选或者变量筛选,是指 ...

  5. 【平面图最小割】BZOJ1001- [BeiJing2006]狼抓兔子

    [题目大意]左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路 1:(x,y)<==>(x+1,y) 2:(x,y)<==>(x,y+1) ...

  6. 命令神器:lsof 常用

    lsof -i 显示所有网络连接lsof -i 6 获取IPv6信息lsof -itcp 显示tcp连接lsof -i:80 显示指定端口信息lsof -i@172.12.5.6 显示指定ip连接ls ...

  7. 极域电子教室3个没被发现的bug(V6 2007)

    bug1:破坏文件传输 在教师端文件分发时利用各种方法退出极域电子教室(包括http://sunnysab.blog.163.com/blog/static/180375009201323191111 ...

  8. play framework系列之打包war

    概览 Play framwork 是我们一直在使用的框架,从刚开始的简单使用,乱起八糟的jar包引用,项目组成员之间的下载项目之后的引用问题等,遇到各种问题,我都一一解决,我将在这个系列中奉上解决方案 ...

  9. VC 调用 Python

    //file:py.h BOOL InitPython(); BOOL ClosePython(); ======================== //file:py.cpp #include & ...

  10. pygame系列_第一个程序_图片代替鼠标移动

    想想现在学校pygame有几个钟了,就写了一个小程序:图片代替鼠标移动 程序的运行效果: 当鼠标移动到窗口内,鼠标不见了,取而代之的是图片..... ========================= ...