我们都知道 Python 作为一门强大的语言,能够适应快速原型和较大项目的制作,因此被广泛用于 web 应用程序的开发中。

在面试的过程中,大家或多或少都被问到过这样一个问题:一个请求从浏览器发出到数据返回都经历过哪些过程?

要回答这个问题,首先你需要对 HTTP 协议、web框架、服务器等底层知识有一定的储备量,同时需要对 web 框架和服务器之间的关联有一定的了解,这里有张图上面详细的标明它们之间的联系。

这么多 wsgi 是不是有点懵逼?看不明白没有关系,下面我会带大家顺着图片里面的顺序一步一步来搞懂里面的概念,厘清它们之间的关系

一、web 框架

在 Python 有很多 web 框架,其中常见的像 Django、Flask、Tornado 、sanic 等,可能有些人对 sanic 不是很熟悉,这里简单说几句,它的用法和 Flask 很相似,但是它支持 async/await 异步并发编程,所以相对来说性能更高。这里就不对这些框架作比较了,因为这不是我们今天的重点!

熟悉的朋友都知道 Web 框架包含一系列库和一个主要的处理器 (handler),这样你就能够构建自己的代码来实现 Web 应用 (比如说一个交互式的网站)。大多数 web 框架包含模式和工具,能实现以下功能:

URL 路由

将输入的 HTTP 请求匹配到特定的路由函数,通过路由函数来调用对应的 Python 代码

请求和响应对象

Python 中的大多的 web 框架都帮我们封装好了来自用户发送的 HTTP 请求 Request,同时也提供了发送给用户浏览器的 Response 对象

模板引擎

能够将实现应用的 Python 代码逻辑和其要产生输出的 HTML (或其他的) 分离开,例如比较知名的 Jinja2 模板引擎。它使用基于文本的模板语言,因此可以用来生成任何类型的标记,而不仅仅是 HTML。它允许定制过滤器、标签、测试和全局变量

Web 服务开发

除了上述之外,单单一个 web 框架并不能支撑我们应用上的服务,需要在开发机上运行 HTTP 服务器,从而快速开发;这就需要涉及到 web 框架和服务器之间的通信等问题。

好在 Python 给我们提供了这样的协议接口,也就是我们常说的 WSGI 协议!下面来了解一下什么是 WSGI 。

二、WSGI协议

Web 服务网关接口 (简称为 "WSGI") 是一种在 Web 服务器和 Python Web 应用程序框架之间的标准接口。通过标准化 Web 服务器和 Python web 应用程序框架之间的行为和通信,WSGI 使得编写可移植的的 Python web 代码变为可能,使其能够部署在任何符合 WSGI 的 web 服务。

有了 WSGI 协议,我们就不需要为每一个 web 框架去搞一套协议,因为基本上所有的Python web 框架都支持这个协议。

三、uWSGI服务器

uWSGI 服务器也就是图片中的所指的 WSGI 容器, 独立 uWSGI 服务器相比传统 web 服务器,使用更少的资源,并提供最高的性能 。Python 中的 uWSGI 服务器应用最广的主要包含以下几个:

Gunicorn

Gunicorn (Green Unicorn,绿色独角兽) 是一个纯 Python WSGI 服务器,用来支持 Python 应用。不像其他 Python web 服务器,它有周全的用户界面,十分易于使用和配置。

Gunicorn 具有合理的默认配置。然而,其他一些像 uWSGI 这样的服务器相较而言过于可定制化,因此更加难以高效使用。

Gunicorn 是如今新 Python web 应用程序的推荐选择。

Waitress

Waitress 是一个纯 Python WSGI 服务器,声称具备 “非常高效的性能”。它的文档不是很详细,但它确实提供了一些很好的而 Gunicorn 没有的功能(例如 HTTP 请求缓冲)。

Waitress 在 Python Web 开发社区中越来越受欢迎。

uWSGI

你没有看错,又是 uWSGI!uWSGI 用来构建全栈式的主机服务。除了进程管理、进程监控和其他功能外, uWSGI 也能作为一个应用服务器,适用于多种编程语言和协议 - 包括 Python 和 WSIG。uWSGI 既能当作独立的 web 路由器来运行,也能运行在一个完整 web 服务器(比如 Nginx 或 Apache )之后。对于后者,web 服务器可以基于 uwsgi 协议 配置 uWSGI 和应用的操作。uWSGI 的 web 服务器支持允许动态配置 Python 、传递环境变量等。

四、uwsgi 协议

uwsgi 协议:与 WSGI 一样是一种通信协议,它是 web 服务器 和 uWSGI 服务器之间的协议,一个 uWSGI 服务器的独占协议,它是用于定义传输信息的类型(type of information),每一个 uwsgi packet前4byte为传输信息类型的描述,与 WSGI协议 是两种东西。

五、Web 服务器端

Web 服务器包括 Nginx,Apache,IIS 等。而优秀的 web 服务器在接收 http 请求时,还可以做负载均衡和反向代理等工作。

Nginx

Nginx 是一个 web 服务器,并且是 HTTP 、SMTP 和其他协议的反向代理。它由其高性能、相对简洁以及对众多应用服务器 (比如 WSGI 服务器) 兼容而著名。

它也拥有便利的特性, 比如负载均衡、基本的认证、流等。Nginx 被设计为承载高负载的网站,并逐渐变得广为流行。所以我们一般用 Nginx来做还可以做负载均衡和反向代理!

当然除了厘清以上的概念及它们之间的关系之外,您还需要知道 HTTP 协议的知识,这部分也是在面试中经常被问到的,这里就不做赘述了。

请帮忙点赞

一文读懂Python web框架和web服务器之间的关系相关推荐

  1. hdfs文档存储服务器,一文读懂HDFS分布式存储框架分析

    一文读懂HDFS分布式存储框架分析 HDFS是一套基于区块链技术的个人的数据存储系统,利用无处不在的私人PC存储空间及便捷的网络为个人提供数据加密存储服务,将闲置的存储空间利用起来,服务于正处于爆发期 ...

  2. python输入什么就输出什么_一文读懂Python的输入和输出

    本文介绍了Python的输入和输出,既然是Python代码,那么就一定有输出量,那么,Python是如何输出的呢? 输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字.比如输出'h ...

  3. hdfs读写流程_一文读懂HDFS分布式存储框架分析

    一文读懂HDFS分布式存储框架分析 HDFS是一套基于区块链技术的个人的数据存储系统,利用无处不在的私人PC存储空间及便捷的网络为个人提供数据加密存储服务,将闲置的存储空间利用起来,服务于正处于爆发期 ...

  4. python读取枚举_一文读懂Python 枚举

    enum是一组绑定到唯一常数值的符号名称,并且具备可迭代性和可比较性的特性.我们可以使用 enum 创建具有良好定义的标识符,而不是直接使用魔法字符串或整数,也便于开发工程师的代码维护. 创建枚举 我 ...

  5. 华科与哈工大计算机学院官网,一文读懂,华中科技大学和哈尔滨工业大学之间的差距...

    原标题:一文读懂,华中科技大学和哈尔滨工业大学之间的差距 序 近些年,华中科技大学经常被热炒,大有拳打各大名校,脚踢清华北大的架势,可以说是网坛上一匹"无敌黑马".无论在是各大论坛 ...

  6. 廖雪峰讲python高阶函数求导公式_一文读懂Python 高阶函数

    高阶函数 将函数作为参数传入,这样的函数称为高阶函数.函数式编程就是指这种高度抽象的编程范式. 变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函 ...

  7. 一文读懂AI如何判断照片中人物的社交关系

    本文经AI新媒体量子位(公众号ID:qbitai)授权转载,转载请联系出处 本文共2256字,建议阅读6分钟. 本文为你介绍AI判断人物社交关系的原理.方法和效果. 人类,天生就有八卦嗅觉. 比如匡扶 ...

  8. 不是python对文件的读操作方法的是-一文读懂Python对文件的各种操作方式-阿里云开发者社区...

    文件操作:Python中的文件对象不仅可以用来访问普通的磁盘文件,而且也可以访问任何其它类型抽象层面上的"文件". 通过Python程序来对计算机中的各种文件进行增删改查的操作,也 ...

  9. 一文读懂深度学习框架下的目标检测(附数据集)

    来源:大数据文摘 编译:及子龙,张礼俊,余志文,钱天培 本文长度为3716字,建议阅读5分钟 本文为你全方位解读机器视觉领域中的目标检测. 从简单的图像分类到3D位置估算,在机器视觉领域里从来都不乏有 ...

最新文章

  1. 比特币现金在与比特币的技术竞争中走在了前列
  2. 来自nativeGetEnabledTags的意外值:0
  3. Sqlite 错误码
  4. destroy 方法_线程方法destroy()和stop(Throwable)在JDK 11中删除
  5. Quantumas,作者太NB了,俺发现俺菜得跟猪一样!!!
  6. 初一辍学学php能行吗_《夺冠》破7亿,辍学的农村姑娘成排球女王,朱婷:百炼才能成钢...
  7. class传参 python_Python 初学者必备的常用内置函数
  8. 【HDU 5532 Almost Sorted Array】水题,模拟
  9. PC服务器实现海量数据存取的方法
  10. 使用AD14创建异形PCB板
  11. python金融分析小知识(25)——如何计算股票每日的收益率并进一步计算净值
  12. 玩转opencv之有趣的调色板
  13. 原始套接字Raw Socket基础-- WSADATA wsaData(转)
  14. android音乐播放器横评,14款Android音乐播放器年度横评 安卓播放器对比测评
  15. 算法学习系列(贪心算法)—机器人攀登问题
  16. 编程中汉字编码和英文编码的语言融合
  17. 数据分析、数据可视化中的常用图形
  18. Android系统消息推送
  19. 上海腾享-演播室LED平板灯-演播室恒力铰链吊杆
  20. python 工具变量回归_stata工具变量法一例:使用2SLS进行ivreg2估计及其检验

热门文章

  1. go语言php编译,Golang模板编译引擎FET
  2. oracle数据泵导入导出_【软件】R语言数据导入与导出
  3. Qt Quick QMl学习笔记 之图片浏览器
  4. 牛刀小试MySQL--基于GTID的replication
  5. stun服务器搭建(coTurn)
  6. Activity切换动画---点击哪里从哪放大
  7. 使用Linux的alternatives命令替换选择软件的版本
  8. ubuntu14.04 在自带python2.7上安装python3.3.5 可以用但是有问题
  9. JavaEE5 Tutorial_JavaBean,JSTL
  10. leetcode 1217 python