WSGI
全称:Web Server Gateway Interface 翻译过来就是Web服务器网关接口;WSGI是一个规范协议,定义了Web服务器如何与Python应用程序进行交互,使得使用Python写的Web应用程序可以和Web服务器对接起来。
在WSGI中定义了两个角色,Web服务器端称为server或者gateway,应用程序端称为application或者framework(因为WSGI的应用程序端的规范一般都是由具体的框架来实现的)。
要使用WSGI,需要分别实现server角色和application角色。
Application端的实现一般是由Python的各种框架来实现的,比如Django, Flask等,一般开发者不需要关心WSGI的实现,框架会会提供接口让开发者获取HTTP请求的内容以及发送HTTP响应;
Server端的实现会比较复杂一点,这个主要是因为软件架构的原因。一般常用的Web服务器,如Apache和nginx,都不会内置WSGI的支持,而是通过扩展来完成。比如Apache服务器,会通过扩展模块mod_wsgi来支持WSGI。Apache和mod_wsgi之间通过程序内部接口传递信息,mod_wsgi会实现WSGI的server端、进程管理以及对application的调用。Nginx上一般是用proxy的方式,用nginx的协议将请求封装好,发送给应用服务器,比如uWSGI或者Gunicorn,应用服务器会实现WSGI的服务端、进程管理以及对application的调用。
WSGI描述了Server与Application之间通信的规范,简单来说,WSGI规范了以下几项内容:
WSGI协议主要包括server和application两部分,server负责接受客户端请求并进行解析,然后将其传入application,application处理请求并将响应头和正文返回server(严格说来,还有一个模块叫做中间件middleware,但中间件也同样使用上述两种接口进行通讯)
- 从server的角度来说,其主要工作是解析http请求,生成一个environ字典并将其传递给可调用的application对象;另外,server还要实现一个start_response函数,其作用是生成响应头,start_response作为参数传入application中并被其调用
- 从application的角度来说,它应当是一个可调用的对象(实现了call 函数的方法或者类),它接受两个参数:environ和start_response,其主要作用就是根据server传入的environ字典来生成一个“可迭代的”http报文并返回给server
调用的结果会被封装成HTTP响应后再发送给客户端。
uwsgi
它是一个二进制协议,可以携带任何类型的数据。一个uwsgi分组的头4个字节描述了这个分组包含的数据类型。
uwsgi是一种线路协议而不是通信协议
,在此常用于在uWSGI服务器与其他网络服务器的数据通信;
uWSGI
uWSGI是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等
image要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。
- WSGI是一种通信协议。
- uwsgi是一种线路协议(而不是通信协议),在此常用于在uWSGI服务器与其他网络服务器的数据通信。
- 而uWSGI是实现了uwsgi和WSGI等协议的Web服务器
附上参考链接
WSGI协议介绍(萌新版)
WSGI,uwsgi, uWSGI详解
网友评论