Python Web开发之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协议,该协议约定了和应用程序之间的接口,即url到app之间的映射。WSGI应用程序,遵从WSGI协议,本身是一个可调用对象,调用start_response,返回响应头部,返回包含正文的可迭代对象。

wsgiref库

        wsgiref是python的一个内置库,遵循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开发请求过程和解析原理提供借鉴和帮助。

  • 9
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WSGIPython Web Server Gateway Interface的缩写,是Python应用程序或框架和Web服务器之间的一种接口,用于在Web服务器上运行Python Web应用程序。在Windows上使用WSGI,可以通过以下步骤实现: 1.安装mod_wsgi模块:可以从官方网站(https://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi)下载对应版本的mod_wsgi模块,然后使用pip进行安装。 2.配置Apache服务器:在httpd.conf文件中添加以下内容: ```apache LoadModule wsgi_module "C:/Python27/Lib/site-packages/mod_wsgi/server/mod_wsgi.pyd" WSGIScriptAlias /myapp "C:/path/to/myapp.wsgi" <Directory "C:/path/to"> Order allow,deny Allow from all </Directory> ``` 其中,第一行是加载mod_wsgi模块,第二行是指定WSGI应用程序的URL路径和WSGI文件的路径,第三至五行是指定WSGI文件所在目录的访问权限。 3.编写WSGI应用程序:创建一个名为myapp.wsgi的文件,编写WSGI应用程序的代码,例如: ```python def application(environ, start_response): status = '200 OK' output = 'Hello World!' response_headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))] start_response(status, response_headers) return [output] ``` 其中,application函数是WSGI应用程序的入口,environ是一个包含HTTP请求信息的字典,start_response是一个回调函数,用于发送HTTP响应头,返回值是HTTP响应体。 4.启动Apache服务器:在命令行中输入httpd命令启动Apache服务器,然后在浏览器中访问http://localhost/myapp即可看到Hello World!的输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值