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 基础知识梳理( ...
随机推荐
- iOS获取当前设备方向
三种方式: self.interfaceOrientation [[UIApplication sharedApplication] statusBarOrientation] [[UIDevice ...
- redis命令_ZREVRANGEBYSCORE
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] 返回有序集 key 中, score 值介于 max 和 min 之间(默 ...
- 算法提高 道路和航路 SPFA 算法
我简单的描述一下题目,题目中所说的有道路和航路: 1.公路是双向的,航路是单向的: 2.公路是正值,航路可正可负: 每一条公路i或者航路i表示成连接城镇Ai(1<=A_i<=T)和Bi(1 ...
- spring-test使用介绍
一.首先引入spring的jar文件到项目中,我采用maven管理项目依赖的jar包: <properties> <spring.version>4.0.0.RELEASE&l ...
- xml传输过程中中文乱码
------------------------------------------request:----------------------------------------------- pu ...
- 【vijos】1764 Dual Matrices(dp)
https://vijos.org/p/1764 自从心态好了很多后,做题的确很轻松. 这种题直接考虑我当前拿了一个,剩余空间最大能拿多少即可. 显然我们枚举每一个点拿出一个矩形(这个点作为右下角), ...
- 微信公众号实现zaabix报警2017脚本(升级企业微信后)
#!/bin/bash CropID='xxxxxxxxxxxxxxxxx' Secret='xxxxxxxxxxxxxxxx' GURL="https://qyapi.weixin.qq. ...
- 数码相机常用CCD/CMOS尺寸对比
数码相机的关键元件CCD或CMOS又称为“影像传感器”,其作用相当于感光胶片.CCD尺寸越大,采集光线的效果越好,画面记录的信息就越多,保留的细节也就越丰富,所以图像更完美漂亮. CCD尺寸的大小与像 ...
- hdu 4289(最小割)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4289 思路:求最小花费,最小割应用,将点权转化为边权,拆点,(i,i+n)之间连边,容量为在城市i的花 ...
- 简单理解Javascript中的call 和 apply
javascript中面向对像的能力是后来加进来的, 为了兼容性, 所以整出了很多奇特的东西, function Animal(){ this.name = "Animal"; t ...