Python3 之 Web 框架:web框架的本质
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3 之 Web 框架:web框架的本质相关的知识,希望对你有一定的参考价值。
各位,学Python 的同志,相信对 Django 、Flask、等不会陌生,这些就是Python语言的web 框架。
那么问题来了,web 服务器又是什么,他和web框架有什么关系?他们又是如何工作的,分别处于什么位置?还有有时候有人会把HTTP服务器叫做web服务器,这是为何?这种说法对吗?带着这些疑问,听我慢慢道来…
一、什么是 Web 服务器
平时我们都是通过浏览器(比如Chrome,Firefox等)上网的,当我们在浏览器的地址栏里输入地址后,会得到一个网页。
这个网页就是 web 服务器返回给我们的,而浏览器就称为客户端,当我们输入网址并按下回车后,就像web服务器发送了一个web请求。
这种模式成为 B/S 模式 ,即 Browse / Server 模式
在浏览器中输入地址、按回车后,按下F12 就是看到如下信息
下面就让我们来目睹整个过程吧
- 建立连接:客户机通过TCP/IP协议建立到服务器的TCP连接。
- 请求过程:客户端向服务器发送HTTP协议请求包(Request),请求服务器里的资源文档。
- 应答过程:服务器向客户机发送HTTP协议应答包(Response),如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言的解释引擎负责处理“动态内容”,并将处理得到的数据返回给客户端。由客户端解释HTML文档,在客户端屏幕上渲染图形结果。
- 关闭连接:客户机与服务器断开。
这里Request 和 Response 都需要遵守 HTTP 协议,关于 HTTP 协议的详细内容,可以读读《HTTP 权威指南
但是实际中的 Web 服务器远远比上面示例的复杂的多,因为要考虑的因素实在是太多了,比如:
- 缓存机制:讲一些经常被访问的页面缓存起来,提高响应速度;
- 安全:防止黑客的各种攻击,比如 SYN Flood 攻击;
- 并发处理:如何响应不同客户端同时发起的请求;
- 日志:记录访问日至,方便做一些分析。
目前在UNIX和LINUX平台下使用最广泛的免费 Web 服务器有Apache和 Nginx 。而这些软件都是遵循遵守 HTTP 协议的。
所以可以称他们为HTTP服务器,只是可以通过HTTP协议语言的解析转换。
Web 应用程序
Web 服务器接受 Http Request,返回 Response,很多时候 Response 并不是静态文件,因此需要有一个应用程序根据 Request 生成相应的 Response。这里的应用程序主要用来处理相关业务逻辑,读取或者更新数据库,根据不同 Request 返回相应的 Response。注意这里并不是 Web 服务器本身来做这件事,它只负责 Http 协议层面和一些诸如并发处理,安全,日志等相关的事情。
应用程序可以用各种语言编写(Java, PHP, Python, Ruby等),这个应用程序会从Web服务器接收客户端的请求,处理完成后,再返回响应给Web服务器,最后由Web服务器返回给客户端。整个架构如下:
对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。
Web 框架(framework)
框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演。
以 python web 框架 flask 为例,框架本身并不限定我们用哪种架构来组织我们的应用,不过其中一种比较经典的Web框架 Flask 采用了 MVC 架构,可以很好地支持以 MVC 方式组织应用。
- 用户输入 URL,客户端发送请求
-
控制器(Controller)
首先会拿到请求 - 然后用
模型(Models)
从数据库取出所有需要的数据,进行必要的处理,将处理后的结果发送给视图(View)
- 视图利用获取到的数据,进行渲染生成 Html Response返回给客户端。
如下图所示:
还有一种同样热门且强大的 Web 框架: Django
它的模式是:MTV
Django的MTV模式本质是各组件之间为了保持松耦合关系,Django的MTV分别代表:
- Model(模型):负责业务对象与数据库的对象(ORM)
- Template(模版):负责如何把页面展示给用户
- View(视图):负责业务逻辑,并在适当的时候调用Model和Template
此外,Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template
Web 服务器网关接口
我们知道Python有着许多的 Web 框架,而同时又有着许多的 Web 服务器(Apache, Nginx, Gunicorn等),框架和Web服务器之间需要进行通信,如果在设计时它们之间不可以相互匹配的,那么选择了一个框架就会限制对 Web 服务器的选择,这显然是不合理的。
那么,怎样确保可以在不修改Web服务器代码或网络框架代码的前提下,使用自己选择的服务器,并且匹配多个不同的网络框架呢?答案是接口,设计一套双方都遵守的接口就可以了。对python来说,就是WSGI
(Web Server Gateway Interface,Web服务器网关接口)。其他编程语言也拥有类似的接口:例如Java的Servlet API和Ruby的Rack。
Python WSGI的出现,让开发者可以将 Web 框架与 Web 服务器的选择分隔开来,不再相互限制。现在,你可以真正地将不同的 Web 服务器与Web框架进行混合搭配,选择满足自己需求的组合。例如,可以使用 Gunicorn 或Nginx/uWSGI来运行Django、Flask或web.py应用。
总结
Web Server 包括 提供 Htttp 服务的软件,Web 应用程序,后端存储数据库
以上是关于Python3 之 Web 框架:web框架的本质的主要内容,如果未能解决你的问题,请参考以下文章
web框架之Bootstrap基本使用(python3入门)
web框架之Vue渐进式框架-安装入门简介(python3入门)