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基础知识(转)的更多相关文章

  1. Python全栈开发之17、tornado和web基础知识

    一.web基础知识 学习web框架之前,先来看一下web基础知识,首先要明白其本质就是socket,用户对应一个socket客户端,但是如果从socket开始开发web应用程序那么效率太了,正确的做法 ...

  2. .NET面试题系列[1] - .NET框架基础知识(1)

    很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...

  3. RabbitMQ基础知识

    RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...

  4. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  5. selenium自动化基础知识

    什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...

  6. [SQL] SQL 基础知识梳理(一)- 数据库与 SQL

    SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...

  7. [SQL] SQL 基础知识梳理(二) - 查询基础

    SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...

  8. [SQL] SQL 基础知识梳理(三) - 聚合和排序

    SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...

  9. [SQL] SQL 基础知识梳理(四) - 数据更新

    SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...

随机推荐

  1. make之eval函数

    函数原型: $(eval text) 它的意思是 text 的内容将作为makefile的一部分而被make解析和执行. 需要注意的是该函数在执行时会对它的参数进行两次展开,第一次展开是由函数本身完成 ...

  2. tensorflow 之模型的保存与加载(三)

    前面的两篇博文 第一篇:简单的模型保存和加载,会包含所有的信息:神经网络的op,node,args等; 第二篇:选择性的进行模型参数的保存与加载. 本篇介绍,只保存和加载神经网络的计算图,即前向传播的 ...

  3. Prerender Application Level Middleware - ASP.NET Core Middleware

    In the previous post Use Prerender to improve AngularJS SEO, I have explained different solutions at ...

  4. 详解 SWT 中的 Browser.setUrl(String url, String postData, String[] headers) 的用法

    http://hi.baidu.com/matrix286/item/b9e88b28b90707c9ddf69a6e ———————————————————————————————————————— ...

  5. 使用jmeter实现对jar包的调用

    一.前言 在我们测试接口的过程中,可能有时需要用到第三方jar包来生成一些测试数据(如有时需要对参数的输入值使用第三方jar包进行加密操作),涉及到这种的情况,普遍做法是:手动调用jar包获得需要的值 ...

  6. 邮件正文及其附件的发送的C++实现

     这段代码我花了整整一天来编写,假设转载,请注明出处,谢谢!    前面的一篇文章已经讲了怎样发送邮件正文,原理我就不再叙述了.要了解的同学请到这里查看!    http://blog.csdn.ne ...

  7. (转)ThreadLocal

    转自:http://blog.csdn.net/lufeng20/article/details/24314381 Thread同步机制的比较 ThreadLocal和线程同步机制相比有什么优势呢?T ...

  8. SmartStoreNet解图

    概述: Ioc: Autofac 1. 通过继承, 对MVC的Controller的加强.

  9. 下载VMware

    1.进入VMware官网:http://www.vmware.com/cn 2.找到下载,点击Workstation Pro,此时需要账号登录. 3.选择需要下载的版本.对应的操作系统,点击转至下载

  10. jQuery ajax 动态append创建表格出现不兼容ie8

    非常多情况下.通过js(jQuery1.10)动态来创建一些样式,对页面的动态交互来说是非常方便的 可是不同的浏览器针对动态生成的不是非常兼容,在此遇见的不兼容ie8.跟各位分享下 代码: json数 ...