WSGI(全称Web Server Gate Interface,Web服务器网关接口)是Python为了规范和简化Web服务开发过程,定义了一种Web服务器和应用框架之间的简单而通用的接口标准规范,即规定了请求的URL到后台处理函数之间改如何实现。WSGI在Python Web开发中地位显著,但是仅通过它开发Web还是过于底层,应用较广的那些Django、Falsk等开发框架,都是在WSGI基础上抽象了一层,使得更加专注于业务应用设计,避免过多精力耗费在网络协议间的解析与转换。
请求过程
Web 编程就是对HTTP协议的应用,我们能使用 socket 自制 web 服务器,但每次都需要自己处理协议的内容很烦琐,所以可以把HTTP协议的东西外包给专门的HTTP服务器软件,而 python 就只是单纯的负责处理业务,再通过 WSGI 把两者关联起来。
- 浏览器到WSGI Server:浏览器发送的请求会先到WSGI Server;
- environ:WSGI Server会将HTTP请求中的参数等信息封装到environ(一个字典)中;
- WSGI Server到WSGI App:App就是我们自己编写的后台程序,每个URL会映射到对应的入口处理函数(或其他可调用对象),WSGI Server调用后台App时,会将environ和WSGI Server中自己的一个start_response函数注入到后台App中;
- 逻辑处理:后台函数(或其他可调用对象)需要接收environ和start_response,进行逻辑处理后返回一个可迭代对象,可迭代对象中的元素为HTTP正文;
- WSGI App到WSGI Server:后台函数处理完后,会先调用start_response函数将HTTP状态码、报文头等信息(响应头)返回给WSGI Server,然后再将函数的返回值作为HTTP正文(响应body)返回给WSGI Server;
- WSGI Server到浏览器:WSGI Server将从App中得到的所有信息封装为一个response返回给浏览器;
从上述一系列流程可看出,WSGI web服务器,本质上是一个TCP服务器,监听在特定的端口上。支持HTTP协议,能够解析HTTP请求报文,能够按HTTP协议将响应数据封装为报文并返回给浏览器。实现了WSGI协议,该协议约定了和应用程序之间的接口,即url到app之间的映射。WSGI应用程序,遵从WSGI协议,本身是一个可调用对象,调用start_response,返回响应头部,返回包含正文的可迭代对象。
wsgiref库
wsgiref是python的一个内置库,遵循WSGI接口服务协议规范。只需要简单几步的接口调用,就可以搭建一个建议web服务器,搭建如下:
WSGI 演化
uwsgi:与WSGI一样是一种通信协议,是uWSGI服务器的独占协议,用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型的描述,与WSGI协议是两种东西,据说该协议是fcgi协议的10倍快。使用C语言开发,会和底层接触的更好,配置也是比较方便。
uWSGI:是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等。主要特点是:超快的性能、低内存占用、多app管理、详尽的日志功能(可以用来分析app的性能和瓶颈)、高度可定制(内存大小限制,服务一定次数后重启等)。
本地开发及调试过程中,利用WSGI搭建localhost服务器即可满足需要。然而,实际生产环境需要满足更高的要求和多样化应用场景,单一的WSGI显然无法满足。
当前二级结构,WSGI作为服务器,到了HTTP协议以及wsgi协议,Django应用作为application,实现了wsgi协议。当有客户端发来请求,WSGI服务接受请求,调用Django app得到相应,之后相应给浏览器。
Django等web框架会自己附带一个wsgi服务器(这就是Django应用可以直接启动的原因),但是这只是在开发阶段用到的,在生产环境是不够用的,所以用到性能高的uwsgi。
Web部署后的实际生产环境中,uWSGI作为中间件,它用到了uwsgi协议(与nginx通信),wsgi协议(调用Django app)。当浏览器发来请求,nginx先做处理(静态资源是nginx的强项),无法处理的请求(uWSGI),最后的相应也是nginx回复给浏览器的。
多了一层反向代理,提高Web server性能(uWSGI处理静态资源不如Nginx,Nginx会在收到一个完整的HTTP请求后再转发给wWSGI),Nginx可以做负载均衡(多个服务器时),保护了实际的web服务器(客户端是和nginx交互而不是uWSGI)
针对日常开发过程中涉及到的WSGI原理及流程进行了学习总结,希望对后续Python Web开发请求过程和解析原理提供借鉴和帮助。
原文地址:https://blog.csdn.net/lukuanpromise/article/details/123498944
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_11305.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!