本文介绍: Python Web开发之WSGI WSGI(全称Web Server Gate Interface,Web服务器网关接口)是Python为了规范和简化Web服务开发过程定义了一种Web服务器应用框架之间的简单而通用的接口标准规范,即规定了请求的URL到后台处理函数之间改如何实现。WSGI在Python Web开发中地位显著,但是仅通过它开发Web还是过于底层,应用较广的那些Django、Falsk开发框架,都是在WSGI基础上抽象了一层,使得更加专注于业务应用设计,避免过多精力耗费在网…

Python Web开发之WSGI

      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 把两者关联起来。

 如上图所示,常规流程如下:

  1. 浏览器到WSGI Server:浏览器发送的请求会先到WSGI Server;
  2. environ:WSGI Server会将HTTP请求中的参数信息封装environ(一个字典)中;
  3. WSGI Server到WSGI App:App就是我们自己编写后台程序每个URL会映射对应的入口处理函数(或其他可调用对象),WSGI Server调用后台App时,会将environ和WSGI Server中自己的一个start_response函数注入到后台App中;
  4. 逻辑处理后台函数(或其他可调用对象需要接收environ和start_response,进行逻辑处理返回一个迭代对象,可迭代对象中的元素为HTTP正文;
  5. WSGI App到WSGI Server:后台函数处理完后,会先调用start_response函数将HTTP状态码、报文头等信息响应头)返回给WSGI Server,然后再将函数的返回值作为HTTP正文(响应body)返回给WSGI Server;
  6. WSGI Server到浏览器:WSGI Server将从App中得到的所有信息封装一个response返回给浏览器

        从上述一系列流程可看出,WSGI web服务器,本质上是一个TCP服务器监听在特定的端口上。支持HTTP协议,能够解析HTTP请求报文,能够按HTTP协议响应数据封装报文并返回给浏览器实现了WSGI协议,该协议约定了和应用程序之间的接口,即urlapp之间的映射。WSGI应用程序,遵从WSGI协议,本身是一个可调用对象,调用start_response,返回响应头部,返回包含正文的可迭代对象

wsgiref

        wsgirefpython一个内置库,遵循WSGI接口服务协议规范。只需要简单几步的接口调用,就可以搭建一个建议web服务器,搭建如下:

                 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进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注