Python3.6学习笔记(六)
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学习笔记(六)的更多相关文章
- python3.4学习笔记(六) 常用快捷键使用技巧,持续更新
python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...
- python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码
python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...
- python3.4学习笔记(十六) windows下面安装easy_install和pip教程
python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...
- python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑
python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件?当我们点开下载页时, 一般 ...
- python3.4学习笔记(四) 3.x和2.x的区别,持续更新
python3.4学习笔记(四) 3.x和2.x的区别 在2.x中:print html,3.x中必须改成:print(html) import urllib2ImportError: No modu ...
- python3.4学习笔记(十七) 网络爬虫使用Beautifulsoup4抓取内容
python3.4学习笔记(十七) 网络爬虫使用Beautifulsoup4抓取内容 Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖 ...
- python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容
python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI,采用Python语言编写 ...
- python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例
python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
随机推荐
- 包装印刷行业裕同集团&易普优APS项目顺利验收!
裕同集团&易普优APS项目于2017年7月启动,2018年1月上线,2018年5月初项目顺利验收!历时十个月,龙岗作为裕同集团APS的先锋试点项目,同时也是业务最复杂的分公司,双方联合团队紧密 ...
- Django实战(6):对比RoR和Django的模板系统
scaffold的生成物虽然用处不大,但是给我们带来一些最佳实践.其中就有模板的继承和分区. 如果你深入使用过rails的模板体系,那么恭喜你:你有超强的忍耐力!而且更重要的是,你只需要3分钟就可以理 ...
- 开始Hibernate介绍
1.介绍 一个框架 一个Java领域内的持久化框架 一个ORM框架 2.持久化 和数据库相关的各种操作 保存 更新 删除 查询 加载:根据特定的OID,把一个对象从数据库加载到你内存中. OID:为了 ...
- 设置 cookie过期时间
cookie.setMaxAge(0);//不记录cookie cookie.setMaxAge(-1);//会话级cookie,关闭浏览器失效 cookie.setMaxAge(60*60);//过 ...
- ubuntu 安装 Sqlite 和 可视化工具 SqliteBroswer
ubuntu 安装 Sqlite 和 可视化工具 SqliteBroswer 下载sqlite www.sqlite.org/download.html 安装Sqlite 创建一个目录: ...
- UVALive - 6912 Prime Switch (状压DP)
题目链接:传送门 [题意]有n个灯,m个开关,灯的编号从1~n,每个开关上有一个质数,这个开关同时控制编号为这个质数的倍数的灯,问最多有多少灯打开. [分析]发现小于根号1000的质数有10个左右,然 ...
- git merge和git rebase的区别(转)
Description git rebase 和 git merge 一样都是用于从一个分支获取并且合并到当前分支,但是他们采取不同的工作方式,以下面的一个工作场景说明其区别 场景: 如图所示: ...
- [BZOJ4811][YNOI2017]由乃的OJ(树链剖分+线段树)
起床困难综合症那题,只要从高往低贪心,每次暴力跑一边看这一位输入0和1分别得到什么结果即可. 放到序列上且带修改,只要对每位维护一个线段树,每个节点分别记录0和1从左往右和从右往左走完这段区间后变成的 ...
- HDU 6194 string string string(后缀自动机)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3238 [题目大意] 给出一个字符串求其出现恰好k次的子串数量 [题解] 对串建立AC自 ...
- 20162307 课堂测试 hash
20162307 课堂测试 hash 作业要求 利用除留余数法为下列关键字集合的存储设计hash函数,并画出分别用开放寻址法和拉链法解决冲突得到的空间存储状态(散列因子取0.75) 关键字集合:85, ...