一、什么是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用一个包含两个str
的tuple
表示。
通常情况下,都应该把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()
函数怎么调用?如果我们自己调用,两个参数environ
和start_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
详解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用一个包含两个str
的tuple
表示。
通常情况下,都应该把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()
函数怎么调用?如果我们自己调用,两个参数environ
和start_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
一、什么是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用一个包含两个str
的tuple
表示。
通常情况下,都应该把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()
函数怎么调用?如果我们自己调用,两个参数environ
和start_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