WSGI基础知识(转)
add by zhj: WSGI全称Web Server Gateway Interface,即Web网关接口。其实它并不是OSI七层协议中的协议,它就是一个接口(即函数)而已,而WSGI规定了该接口的输入,输出等,其中输入是指Python应用程序服务器调用接口时提供的实参包含哪些数据,输出是指接口必须返回哪些参数给接口调用者(即Python应用程序服务器)。应用程序服务器会直接调用Web框架的WSGI接口,而不是通过socket来调用。说白了,WSGI就是接口的规范而已
WSGI基础知识
翻译自
Basics of WSGIhttp://agiliq.com/blog/2013/07/basics-wsgi/
译文 WSGI基础知识
在这篇文章里,我们将会写一个web app,这个app它会服务一些url。我们将不会使用任何Python框架来写它。我们只是去说明一下这些机制的背后原理。
在开始写这个web app之前,我们先来澄清几个下文将要用到的术语。
Web服务器(Web Server): 当我们说Web 服务器时,我们指的是软件,而不是那些存储你代码的硬件机器。这个服务器会接收从客户端(Web浏览器)发送过来的请求并返回一个响应(response)。Web服务器本身并不创建响应,它只负责返回响应。所以,Web服务器就需要同Web应用程序交流,因为Web应用程序它能产生响应。
Web应用程序(Web Application):Web服务器从它这里拿到响应。Web Application的职责就是根据url来创建响应并将响应传回给Web服务器。然后Web服务器就只是返回这个响应到客户端而已。
WSGI: WSGI是一个接口,它只是一份规范或者说是一系列的规则。WSIG不是一个软件。
WSGI会引起人们的注意是因为Web服务器需要跟Web应用程序通信。WSGI规定了Web应用程序和Web服务器双方必须实现的规则,以便让它们之间能够互相交互。这么说吧,一个符合WSGI规范的服务器就可以跟一个符合WSGI规范的Web应用程序通信。
在WSGI架构里,WSGI应用程序必须是一个可调用者(callable),并且这个可调用者(callable)必须被传递给Web服务器,这样不管什么时候,只要Web服务器接收到客户端的一个请求,它就能随时调用Web应用程序。
想要了解更多关于为什么WSGI会得以出现的原因,请参照 WSGI的维基百科。
现在开始写我们的Web应用程序。你暂时只需要全部拷贝下面的代码即可,我们稍后会对每一行代码做详细解释以便清楚地知道它们都做了什么。
#web_application.py
from wsgiref.simple_server import make_server
def application(environ, start_response):
path = environ.get('PATH_INFO')
if path == '/':
response_body = "Index"
else:
response_body = "Hello"
status = "200 OK"
response_headers = [("Content-Length", str(len(response_body)))]
start_response(status, response_headers)
return [response_body]
httpd = make_server(
'127.0.0.1', 8051, application)
httpd.serve_forever()
这个脚本可以通过运行命令python web_application.py来执行,接着你可以在浏览器中访问链接http://127.0.0.1:8051/和http://127.0.0.1:8051/abcd。你将看到第一个页面会返回Index,而第二个页面返回Hello。
现在,我们来逐句分析下代码。
- Python提供了一个方法叫做
make_server。我们可以用它来创建一个遵循WSGI规范的基于Python的Web服务器。 - 我们创建了一个
callable叫做application。你可以认为这个callable就是上文所说的Web应用程序。 make_server()方法创建了一个遵循WSGI规范的web服务器。这里的httpd就是Web服务器。make_server()的前两个参数指定了主机(host)以及Web服务器监听请求的端口(port)。make_server()的第三个参数是Web应用程序,Web服务器将利用这个参数来获取响应。- 代码的最后一行通过
serve_forever来启动Web服务器。
不管什么时候,只要有请求进来,运行在8051端口的Web服务器就会去调用Web应用程序,在我们这个例子里,Web应用程序就是callable application.
下面是关于Web应用程序代码的细节。
- 为了能和WSGI的Web服务器交互,Web应用程序同样也必须遵循WSGI规范。
- 服务器调用它时需要两个参数。所以,它必须接收两个参数,这是Web应用程序遵循WSGI规范的第一个条件。
- 传给它的第一个参数是包含了许多关于请求(request)信息的一个变量。在我们这个例子里,我们用它来读取请求的路径。
- 传给它的第二个参数是一个
callable。应用程序必须利用这个callable来通知服务器关于响应的状态以及设定各种报头(headers)。这是Web应用程序遵循WSGI规范的第二个条件。 - 我们的应用程序满足了遵循WSGI规范所要求的两个条件。
- 最后,应用程序返回一个响应给WSGI服务器。
- 然后,服务器最终会转发这个响应给客户端。
编辑:
我之前在application的代码里忽略了一件事,defnull童鞋在reddit上指出了我的错误。
application的最后一行不能返回response_body,正确的情况是它应该返回[response_body]。原因是:
- WSGI服务器期望从应用程序返回一个
iterable然后它会将这个iterable的每一个元素以一种无缓冲的方式发送给客户端。 - 如果我们坚持返回
response_body,那么response_body是一个string同时也是一个iterable,这样的话我们的代码确实还能正常工作不会报错。但是同时也使得response_body中的内容将会被一个字符一个字符地传递。 - 然而,如果我们返回的是
[response_body], 在这里,这个iterable是一个list, 这个list只有唯一一个元素即response_body字符串。这样,在我们这个例子里,整个response_body就只需要被传递一次。 - 这就是为什么我们应该返回
[response_body]而不是response_body。上面的代码我已经改过来了。
你应该读读这篇WSGI来了解更多关于WSGI。
译者注
- 更新时间:
2014-11-28 - 本人翻译的初衷是为了自身学习和记录,翻译不好的地方,还望读者见谅.
WSGI基础知识(转)的更多相关文章
- Python全栈开发之17、tornado和web基础知识
一.web基础知识 学习web框架之前,先来看一下web基础知识,首先要明白其本质就是socket,用户对应一个socket客户端,但是如果从socket开始开发web应用程序那么效率太了,正确的做法 ...
- .NET面试题系列[1] - .NET框架基础知识(1)
很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...
- RabbitMQ基础知识
RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...
- Java基础知识(壹)
写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...
- selenium自动化基础知识
什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...
- [SQL] SQL 基础知识梳理(一)- 数据库与 SQL
SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...
- [SQL] SQL 基础知识梳理(二) - 查询基础
SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(三) - 聚合和排序
SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...
- [SQL] SQL 基础知识梳理(四) - 数据更新
SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...
随机推荐
- HTTP认证机制
HTTP的询问/应答机制 如下图: 一个实例的图: 1.客户端请求资源 2.服务器对用户进行询问,在WWW-Authenticate首部中指明在哪里,如何进行认证 3.客户端会在Authenticat ...
- 由于没有正确使用Connection.setAutoCommit(false)而导致SQL语句没有被提交
症状: 提交了Form,执行insert操作,经过Debug也确认PreparedStatement.executeUpdate()返回值>0,但是在MySQL中直接查询表,返回的仍然是Empt ...
- 语言中.C文件和.H文件的概念和联系
//a.h void foo(); //a.c #include "a.h" //我的问题出来了:这句话是要,还是不要? void foo() { return; } //main ...
- pow函数
pow函数如果直接强制类型转换成int,会导致精度的损失.如果是int的幂计算,建议重写函数.或者用double型进行计算.
- Dijkstra普通算法及优先队列优化
#include<stdio.h> #include<iostream> #define maxv 100 #define inf 0x3fffffff using names ...
- VirtualBox虚拟机和主机之间的通信
- VirtualBox的NAT网络模式,主机不能访问虚拟机- 端口转发可以访问,但是性能非常差,第一次连接30秒左右- 有条件的还是推荐VmWare
- JVM Specification 9th Edition (4) Chapter 3. Compiling for the Java Virtual Machine
Chapter 3. Compiling for the Java Virtual Machine 内容列表 3.1. Format of Examples 3.2. Use of Constants ...
- 第一百五十九节,封装库--JavaScript,表单序列化结合ajax提交数据
封装库--JavaScript,表单序列化结合ajax提交数据 封装库,表单序列化方法 /** xu_lie_biao_dan()方法,表单序列化方法,将自动获取指定表单里面的各项字段name值和va ...
- 嵌入式驱动开发之phy---fine Mac与Phy组成原理的简单分析
关键字rj45.pci-e 1. general 下图是网口结构简图.网口由CPU.MAC和PHY三部分组成.DMA控制器通常属于CPU的一部分,用虚线放在这里是为了表示DMA控制器可能会参与到网口数 ...
- 【vijos】1881 闪烁的繁星(线段树+特殊的技巧)
https://vijos.org/p/1881 这场比赛太难了sad.所以我都没做.. 这题一开始我竟然不会sad(本来就不会),然后我继续yy..yy了好久,竟然yy了个什么可拆分的并查集?(sa ...