详解WSGI

一、什么是wsgi

(1)、RESTful只是设计风格而不是标准,而WSGI(Web Server Gateway Interface,Web 服务器网关接口)则是Python语言中所定义的Web服务器和Web应用程序之间或框架之间的通用接口标准

(2)、WSGI就是一座桥梁,桥梁的一端称为服务端或网关端,另一端称为应用端或者框架端,WSGI的作用就是在协议之间进行转化WSGI将Web组件分成了三类:Web 服务器(WSGI Server)、Web中间件(WSGI Middleware)与Web应用程序(WSGI Application)

(3)、Web Server接收HTTP请求,封装一系列环境变量,按照WSGI接口标准调用注册的WSGI Application,最后将响应返回给客户端。

(4)、Web应用的本质:

       1)、浏览器发送HTTP请求                  2)、服务器接收到请求,生成HTML文档

       3)、服务器把HTML文档作为HTTP响应的Body发送给浏览器

       4)、浏览器收到HTTP响应,从HTTP Body取出HTML文档进行显示

接受HTTP请求、解析HTTP请求、发送HTTP响应都是重复的苦力活,如果我们自己来写这些底层代码,还没开始写HTML,先要花半把个月研读HTTP规范。所以底层的代码应该由专门的服务器软件实现,我们用python专注于生成HTML文档。

因为我们不想要接触TCP连接、HTTP原始请求和响应格式。所以需要一个统一的接口,专心用python编写Web业务

这个接口就是 WSGI:(Web 服务器网关接口)。


二、WSGI接口

WSGI接口定义非常简单,它只要求Web开发者实现一个函数,就可以响应HTTP请求

我们来看一个最简单的Web版本的“Hello, world!”:

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return '<h1>Hello, web!</h1>'
start_response('200 OK', [('Content-Type', 'text/html')])

上面的application()函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数:

  • environ:一个包含所有HTTP请求信息dict对象(后面详细介绍environ是什么东西,有哪些内容);

  • start_response:一个发送HTTP响应的函数。

application()函数中,调用:

start_response('200 OK', [('Content-Type', 'text/html')]) #表示响应Body的内容形式

就发送了HTTP响应的Header,注意Header只能发送一次,也就是只能调用一次start_response()

start_response()函数接收两个参数:

一个是HTTP响应码,一个是一组元祖列表list表示的HTTP Header,每个Header用一个包含两个strtuple表示。

通常情况下,都应该把Content-Type头发送给浏览器。其他很多常用的HTTP Header也应该发送。

然后,函数的返回值'<h1>Hello, web!</h1>'将作为HTTP响应的Body发送给浏览器

#####################################################################################################

有了WSGI(Web服务器和Web应用程序之间或框架之间的通用接口标准),我们关心的就是如何从environ这个dict对象拿到HTTP请求信息,然后构造HTML通过start_response()发送Header,最后返回Body(HTTP响应格式)

整个application()函数本身没有涉及到任何解析HTTP的部分,也就是说,底层代码不需要我们自己编写,我们只负责在更高层次上考虑如何响应请求就可以了。

#####################################################################################################

不过,等等,这个application()函数怎么调用?如果我们自己调用,两个参数environstart_response我们没法提供,返回的str也没法发给浏览器。

所以application()函数必须由WSGI服务器来调用。有很多符合WSGI规范的服务器,我们可以挑选一个来用。我们只想尽快测试一下我们编写的application()函数真的可以把HTML输出到浏览器。

Python内置了一个WSGI服务器,这个模块叫wsgiref,它是用纯Python编写的WSGI服务器的参考实现。所谓“参考实现”是指该实现完全符合WSGI标准,但是不考虑任何运行效率,仅供开发和测试使用。

三、运行WSGI服务

编写server.py,负责启动WSGI服务器,加载应用程序application()函数。

#! /usr/bin/python
#server.py
#from wsgiref module import
from wsgiref.simple_server import make_server

#application
def application(environ, start_response):
    start_response('200 OK', [('Content-type', 'text/html')])
    return '<h1>hello world\n</h1>'     #这里也可以使用来自于HTTP请求的环境变量,从environ里读取PATH_INFO。

print 'Serving HTTP on port 8000...'
#create server, IP address, port number, application
httpd = make_server('127.0.0.1', 8000, application)
#开始监听HTTP请求
httpd.serve_forever()

命令行运行 python server.py来启动WSGI服务器:


启动成功后,验证:

(1)、打开浏览器,输入 http:://127.0.0.1:8000/,就可以看到结果了。

(2)、在另一个终端中使用curl命令发送HTTP请求 curl 127.0.0.1:8000,可以看到服务器成功应答。


总结:无论多么复杂的HTTP程序,入口都是WSGI处理函数,HTTP请求的所有输入信息都可以通过environ环境变量获得,HTTP响应的输出都可以通过start_response()加上函数返回值作为HTTP响应的Body。但是光靠一个WSGI函数来处理还是太底层,需要在WSGI之上抽象出Web框架(以后用到再涉及),进一步简化Web开发。


作为新手入门的第一课,高手勿喷,后面会更详细的说明WSGI服务。


参考博客:大部分内容来自于下面,我只是快乐的学习者大笑

http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832689740b04430a98f614b6da89da2157ea3efe2000




阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/li_101357/article/details/52748323
文章标签: wsgi python
个人分类: openstack组件研究
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭