WSGI与ASGI的区别与联系
什么是WSGI
CGI(Common Gateway Interface,通用网关接口),定义客户端与Web服务器的交流方式的一个程序,例如正常情况下客户端发送过来一个请求,根据HTTP协议Web服务器将请求的内容解析出来,经过处理会后,再将返回的内容封装好。例如服务器返回一个HTML页面,并且根据HTTP协议构建返回内容的响应格式,涉及到TCP连接、HTTP原始请求和相应格式都是由一个软件来完成,这个程序就是CGI。
那么WSGI(Python Web Server Gateway Interface,WSGI)Web服务器网关接口,是为Python语言定义的Web服务器和Web应用程序或框架之间的一猴子那个简单而且通用的接口,从语义上理解,WSGI为了解决Web服务器与客户端之间的通信问题而产生的。并且WSGI是基于现存的CGI标准而设计的,同样是一种程序。
WSGI区分为两部分,一种为服务器或网关,另一种为应用程序或应用框架,所谓的WSGI中间件同时实现了API的两方,即在WSGI服务器和WSGI应用之间起调解作用:从WSGI服务器的角度来说,中间件扮演应用程序,而从应用程序的角度来说,中间件扮演服务器。中间件具有的功能有:
重写环境变量后,根据目标URL,将请求消息路由到不同的应用对象。
允许在一个进程中同时运行多个应用程序或应用框架。
负载均衡和远程处理,通过在网络上转发请求和相应消息。
进行内容后处理,例如应用样表。
WSGI就是基于Python的以CGI为标准做一些扩展。
什么是ASGI
WSGI 规范自诞生以来应用广泛,在作为 Python 框架和 web 服务的选择上拥有非常好的灵活性。但,因为是针对 HTTP 风格的请求响应模型做的设计,加上越来越多不遵循这种模式的协议逐渐成为 web 编程的标准之一,比如说,WebSocket。所以需要新的改变。
ASGI 尝试保持在一个简单的应用接口的前提下,提供允许数据能够在任意时候、被任意应用进程发送和接受的抽象。
它同样描绘了一个新的,兼容 HTTP 请求响应以及 WebSocket 数据帧的序列格式。允许这些协议能通过网络或本地 socket 进行传输,以及让不同的协议被分配到不同的进程进行处理。
目的
介于网络协议服务和 Python 应用之间的标准接口,能够处理多种通用协议类型,包括 HTTP、HTTP2 和 WebSocket。在 WSGI 上进行拓展,并最终取代它。在设计上还是包含了 WSGI 到 ASGI 以及 ASGI 到 WSGI 的转换器,目的是为了使 HTTP 协议的编写更为容易。
总览
SGI 由三个不同的组件构成:协议服务、频道层(channel layer)、应用代码。频道层是这个实现中最重要的部分,它能同时对协议服务和应用提供接口。
一个频道层对协议服务、应用服务提供一个 send 的可调用方法,该方法接受 channel name、message dict 以及一个 receive_many 方法作为参数。receive_many 方法接受 channel name 的 list 作为参数,返回指定频道的下一条可用的消息。
所以,相较于在 WSGI 上,我们将协议服务直接指向应用,在 ASGI 里,我们将协议服务和应用同时指向一个频道层的实例。它的目的是让应用服务和协议服务总是运行在不同的进程或者线程中,并通过频道层进行通信。
区别
总体来说就是ASGI对于WSGI原有的模式的支持和WebSocket的扩展,即ASGI是WSGI的扩展。