WSGI

引言

了解了HTTP协议和HTML文档,咱们其实就明白了一个Web应用的本质就是:html

1.浏览器发送一个HTTP请求;

2.服务器收到请求,生成一个HTML文档;

3.服务器把HTML文档做为HTTP响应的Body发送给浏览器;

4.浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示。

  

因此,最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。Apache、Nginx、Lighttpd等这些常见的静态服务器就是干这件事情的。python

 

若是要动态生成HTML,就须要把上述步骤本身来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,若是咱们本身来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。web

正确的作法是底层代码由专门的服务器软件实现,咱们用Python专一于生成HTML文档。由于咱们不但愿接触到TCP链接、HTTP原始请求和响应格式,因此,须要一个统一的接口,让咱们专心用Python编写Web业务。浏览器

这个接口就是WSGI:Web Server Gateway Interface。bash

 

一:WSGI介绍

1:介绍

WSGI是Web 服务器(uWSGI)与 Web 应用程序或应用框架(Django)之间的一种低级别的接口

 

WSGI:全称是Web Server Gateway InterfaceWSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web server如何与web application通讯的规范。serverapplication的规范在PEP 3333中有具体描述。要实现WSGI协议,必须同时实现web server和web application,当前运行在WSGI协议之上的web框架有Torando,Flask,Django服务器

uwsgi:WSGI同样是一种通讯协议,是uWSGI服务器的独占协议,用于定义传输信息的类型(type of information),每个uwsgi packet前4byte为传输信息类型的描述,与WSGI协议是两种东西,听说该协议是fcgi协议的10倍快。app

uWSGI:是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等。框架

 

WSGI协议主要包括serverapplication两部分:webapp

WSGI server负责从客户端接收请求,将request转发给application,将application返回的response返回给客户端;
WSGI application接收由server转发的request,处理请求,并将处理结果返回给server。application中能够包括多个栈式的中间件(middlewares),这些中间件须要同时实现server与application,所以能够在WSGI服务器与WSGI应用之间起调节做用:对服务器来讲,中间件扮演应用程序,对应用程序来讲,中间件扮演服务器。

 

 

WSGI协议实际上是定义了一种serverapplication解耦的规范,便可以有多个实现WSGI server的服务器,也能够有多个实现WSGI application的框架,那么就能够选择任意的server和application组合实现本身的web应用。例如uWSGIGunicorn都是实现了WSGI server协议的服务器,DjangoFlask是实现了WSGI application协议的web框架,能够根据项目实际状况搭配使用函数

 

 

2:WSGI规范

WSGI规范以下:

  • 服务器的请求处理程序中要调用符合WSGI规范的网关接口;
  • 网关接口调用应用程序,而且要定义start_response(status, headers)函数,用于返回响应;
  • 应用程序中实现一个函数或者一个可调用对象webapp(environ, start_response)。其中environ是环境设置的字典,由服务器和WSGI网关接口设置,start_response是由网关接口定义的函数。

在Python标准库中,wsgiref包就是符合WSGI标准的Web服务实现。后面简单对wsgiref包进行介绍,以此来对符合WSGI标准的Web服务的实现过程进行梳理。

 

 

 

二:实现WSGI

 

WSGI接口定义很是简单,它只要求Web开发者实现一个函数,就能够响应HTTP请求。咱们来看一个最简单的Web版本的“Hello, web!”:

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

 

 

而后,再编写一个server.py,负责启动WSGI服务器,加载application()函数:

# server.py
# 从wsgiref模块导入:
from wsgiref.simple_server import make_server
# 导入咱们本身编写的application函数:
from hello import application

# 建立一个服务器,IP地址为空,端口是8000,处理函数是application:
httpd = make_server('', 8000, application)
print('Serving HTTP on port 8000...')
# 开始监听HTTP请求:
httpd.serve_forever()

 

 

 

小结

不管多么复杂的Web应用程序,入口都是一个WSGI处理函数。HTTP请求的全部输入信息均可以经过environ得到,HTTP响应的输出均可以经过start_response()加上函数返回值做为Body。

复杂的Web应用程序,光靠一个WSGI函数来处理仍是太底层了,咱们须要在WSGI之上再抽象出Web框架,进一步简化Web开发。

 

 


 

参考资料

http://python.jobbole.com/88637/

http://python.jobbole.com/88653/

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432012393132788f71e0edad4676a3f76ac7776f3a16000

相关文章
相关标签/搜索