WSGI协议

首先弄清下面几个概念:

WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web server如何与web application通信的规范。server和application的规范在PEP 3333中有具体描述。要实现WSGI协议,必须同时实现web server和web application,当前运行在WSGI协议之上的web框架有Bottle, Flask, Django。

uwsgi:与WSGI一样是一种通信协议,是uWSGI服务器的独占协议,用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型的描述,与WSGI协议是两种东西,据说该协议是fcgi协议的10倍快。

uWSGI:是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等。

WSGI协议主要包括server和application两部分:

WSGI server负责从客户端接收请求,将request转发给application,将application返回的response返回给客户端;

WSGI application接收由server转发的request,处理请求,并将处理结果返回给server。application中可以包括多个栈式的中间件(middlewares),这些中间件需要同时实现server与application,因此可以在WSGI服务器与WSGI应用之间起调节作用:对服务器来说,中间件扮演应用程序,对应用程序来说,中间件扮演服务器。

WSGI协议其实是定义了一种server与application解耦的规范,即可以有多个实现WSGI server的服务器,也可以有多个实现WSGI application的框架,那么就可以选择任意的server和application组合实现自己的web应用。例如uWSGI和Gunicorn都是实现了WSGI server协议的服务器,Django,Flask是实现了WSGI application协议的web框架,可以根据项目实际情况搭配使用。

像Django,Flask框架都有自己实现的简单的WSGI server,一般用于服务器调试,生产环境下建议用其他WSGI server。

WSGI协议的实现

以Django为例,分析一下WSGI协议的具体实现过程。

django WSGI application

WSGI application应该实现为一个可调用对象,例如函数、方法、类(包含`call`方法)。需要接收两个参数:

一个字典,该字典可以包含了客户端请求的信息以及其他信息,可以认为是请求上下文,一般叫做environment(编码中多简写为environ、env)

一个用于发送HTTP响应状态(HTTP status )、响应头(HTTP headers)的回调函数

通过回调函数将响应状态和响应头返回给server,同时返回响应正文(response body),响应正文是可迭代的、并包含了多个字符串。下面是Django中application的具体实现部分:

可以看出application的流程包括:

加载所有中间件,以及执行框架相关的操作,设置当前线程脚本前缀,发送请求开始信号;

处理请求,调用get_response()方法处理当前请求,该方法的的主要逻辑是通过urlconf找到对应的view和callback,按顺序执行各种middleware和callback。

调用由server传入的start_response()方法将响应header与status返回给server。

返回响应正文

django WSGI Server

负责获取http请求,将请求传递给WSGI application,由application处理请求后返回response。以Django内建server为例看一下具体实现。

通过runserver运行django项目,在启动时都会调用下面的run方法,创建一个WSGIServer的实例,之后再调用其serve_forever()方法启动服务。

下面表示WSGI server服务器处理流程中关键的类和方法。

.WSGIServer

run()方法会创建WSGIServer实例,主要作用是接收客户端请求,将请求传递给application,然后将application返回的response返回给客户端。

创建实例时会指定HTTP请求的handler:WSGIRequestHandler类

通过set_app和get_app方法设置和获取WSGIApplication实例wsgi_handler

处理http请求时,调用handler_request方法,会创建WSGIRequestHandler实例处理http请求。

WSGIServer中get_request方法通过socket接受请求数据

.WSGIRequestHandler

由WSGIServer在调用handle_request时创建实例,传入request、cient_address、WSGIServer三个参数,__init__方法在实例化同时还会调用自身的handle方法

handle方法会创建ServerHandler实例,然后调用其run方法处理请求

.ServerHandler

WSGIRequestHandler在其handle方法中调用run方法,传入self.server.get_app()参数,获取WSGIApplication,然后调用实例(__call__),获取response,其中会传入start_response回调,用来处理返回的header和status。

通过application获取response以后,通过finish_response返回response

.WSGIHandler

WSGI协议中的application,接收两个参数,environ字典包含了客户端请求的信息以及其他信息,可以认为是请求上下文,start_response用于发送返回status和header的回调函数

虽然上面一个WSGI server涉及到多个类实现以及相互引用,但其实原理还是调用WSGIHandler,传入请求参数以及回调方法start_response(),并将响应返回给客户端。

django simple_server

django的simple_server.py模块实现了一个简单的HTTP服务器,并给出了一个简单的demo,可以直接运行,运行结果会将请求中涉及到的环境变量在浏览器中展示出来。

其中包括上述描述的整个http请求的所有组件:

ServerHandler, WSGIServer, WSGIRequestHandler,以及demo_app表示的简易版的WSGIApplication。

可以看一下整个流程:

demo_app()表示一个简单的WSGI application实现,通过make_server()方法创建一个WSGIServer实例,调用其handle_request()方法,该方法会调用demo_app()处理请求,并最终返回响应。

uWSGI

uWSGI旨在为部署分布式集群的网络应用开发一套完整的解决方案。主要面向web及其标准服务。由于其可扩展性,能够被无限制的扩展用来支持更多平台和语言。uWSGI是一个web服务器,实现了WSGI协议,uwsgi协议,http协议等。

uWSGI的主要特点是:

超快的性能

低内存占用

多app管理

详尽的日志功能(可以用来分析app的性能和瓶颈)

高度可定制(内存大小限制,服务一定次数后重启等)

uWSGI服务器自己实现了基于uwsgi协议的server部分,我们只需要在uwsgi的配置文件中指定application的地址,uWSGI就能直接和应用框架中的WSGI application通信。

参考阅读:

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

python uwsgi_python Web开发你要理解的WSGI uwsgi详解相关推荐

  1. 学python开发必须要会wsgi么_python Web开发你要理解的WSGI uwsgi详解

    WSGI协议 首先弄清下面几个概念: WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web ...

  2. 第二部分_搭建Java Web开发环境与配置Tomcat服务器JSP详解

    MyEclipse集成Tomcat 首先配置Tomcat,即配置环境变量Java_HOME.path,在第一讲中已经完成了,不再赘述. Eclipse代码风格导入MyEclipse: 每个项目都要配置 ...

  3. Ajax技术WEB开发__WEB2.0中AJAX应用的详解

    ====================================================== 注:本文源代码点此下载 ================================= ...

  4. python web什么意思_理解Python的Web开发

    因为python代码的优雅美观且易于维护这一特点,越来越多的人选择使用Python做Web开发.而Python的Web框架百花齐放,目前比较流行的框架有大包大揽的Django,小巧灵活的Flask.B ...

  5. 【Python随笔】python的web开发——WSGI、ASGI、uvicorn与FastAPI

    今天这篇文章,聊一下python在web开发上的一些基础实现,阐述下自己理解中的WSGI.ASGI,以及拿uvicorn+FastAPI的组合举个ASGI应用的例子. WSGI python的web服 ...

  6. 如何用Python做Web开发?——Django环境配置

    用Python做Web开发,Django框架是个非常好的起点.如何从零开始,配置好Django开发环境呢?本文带你一步步无痛上手. 概念 最近有个词儿很流行,叫做"全栈"(full ...

  7. pythonweb开发-如何用Python做Web开发?——Django环境配置

    用Python做Web开发,Django框架是个非常好的起点.如何从零开始,配置好Django开发环境呢?本文带你一步步无痛上手. 概念 最近有个词儿很流行,叫做"全栈"(full ...

  8. pythonweb开发-Web | 浅谈用Python进行Web开发

    Web开发这样一个大概念,对我这种小白来说,想学也不知道从哪下手.在网上广泛地浏览了一下这个方面的文章后,我发现当今Web开发的一大热门语言是Python(最大的当然还是PHP),而恰好我平常用Pyt ...

  9. python web开发要学什么_Python WEB开发 用Python开展web开发必须学习什么?

    用Python开展web开发必须学习哪些? 针对新手想更轻轻松松的学好Python开发技术性,Python网络爬虫,Python数据分析,人工智能技术等技术性,这儿给大伙儿共享一套系统软件教育资源,加 ...

最新文章

  1. 特征工程(七)SelectFromModel
  2. 性能优化指南:性能优化的一般性原则与方法
  3. 全球及中国小水电行业投资规模及运行动态分析报告2021年版
  4. Steady Cow Assignment
  5. Android自定义View之上拉、下拉列表 头部元素跟随 缩放、平移效果的实现
  6. ES6新特性_浏览器中使用ES6模块化的另一种方式--JavaScript_ECMAScript_ES6-ES11新特性工作笔记044
  7. C#内存共享通讯示例
  8. 如何使用jstack?线程的状态?
  9. SQL Server 2008 允许远程连接的解决方法
  10. 企业管理系统有几种类型,分别是什么?
  11. 个人收集资料分享(电子、计算机相关)
  12. linux给root权限命令,linux设置root权限命令
  13. 现身说法 程序员 35 岁后的出路
  14. html设置首缩选进两字符,首行缩进2字符怎么设置 css
  15. 解决Microsoft Teredo Tunneling Adapter 這個裝置無法啟動。 (代碼 10)
  16. 是不是选择任何一个方向,都会游向同一个宿命呢
  17. 《带你体验程序员专属编辑器Markdown编辑器|CSDN编辑器测评》
  18. AJAX_json笔记
  19. 社交数据在征信领域的应用探索
  20. Android开发——简单计算器实现

热门文章

  1. AEC、AGC、ANS在视音频会议中的作用?
  2. Apache 流框架 Flink,Spark Streaming,Storm对比分析(一)
  3. Python maketrans() 方法
  4. Android学习笔记进阶十一图片动画播放(AnimationDrawable)
  5. codevs1258 关路灯(☆区间dp)
  6. 【Step By Step】将Dotnet Core部署到Docker下
  7. 1月12号 UIView
  8. Android定位方式和测试方法
  9. IE6、IE7、IE8的CSS、JS兼容
  10. 互联网企业的移动布局