网络框架及MVC
架构
网络框架
所谓网络框架是指这样的一组Python包,它能够使开发者专注于网站应用业务逻辑的开发,而无须处理网络应用底层的协议、线程、进程等方面。这样能大大提高开发者的工作效率,同时提高网络应用程序的质量。
在目前Python语言的几十个开发框架中,几乎所有的全栈网络框架都强制或引导开发者使用MVC架构开发Web应用。
所谓全栈网络框架,是指除了封装网络和线程操作,还提供HTTP栈、数据库读写管理、HTML模板引擎等一系列功能的网络框架。
本文重点讲解的Django、Tornado和Flask是全栈网络框架的典型标杆;而Twisted更专注于网络底层的高性能封装而不提供HTML模板引擎等界面功能,所以不能称之为全栈框架。
MVC
架构
MVC(Model-View-Controller)模式最早由Trygve Reenskaug在1978年提出,在20世纪80年代是程序语言Smalltalk的一种内部架构。
后来MVC被其他语言所借鉴,成为了软件工程中的一种软件架构模式。
MVC把Web应用系统分为3个基本部分。
模型(Model)
用于封装与应用程序的业务逻辑相关的数据及对数据的处理方法,是Web应用程序中用于处理应用程序的数据逻辑的部分,Model只提供功能性的接口,通过这些接口可以获取Model的所有功能。
Model不依赖于View和Controller,它们可以在任何时候调用Model访问数据。
有些Model还提供了事件通知机制,为在其上注册过的View或Controller提供实时的数据更新。
视图(View)
负责数据的显示和呈现,View是对用户的直接输出。
MVC
中的一个Model通常为多个View提供服务。为了获取Model的实时更新数据,View应该尽早地注册到Model中。
控制器(Controller)
负责从用户端收集用户的输入,可以看成提供View的反向功能。
当用户的输入导致View发生变化时,这种变化必须是通过Model反映给View的。
在MVC
架构下,Controller一般不能与View直接通信,这样提高了业务数据的一致性,即以Model作为数据中心。
MVC
架构图
这3个基本部分互相分离,使得在改进和升级界面及用户交互流程时,不需要重写业务逻辑及数据访问代码。
注意:
MVC
在除Python外的其他语言中也有广泛应用,例如VC++
的MFC
、Java的Structs
及Spring、C#的.NET开发框架。
Python主流的后端框架
Django
相对于Python的其他Web框架,
Django
的功能是最完整的,Django
定义了服务发布、路由映射、模板编程、数据处理的一整套功能。这也意味着
Django
模块之间紧密耦合,开发者需要学习Django
自己定义的这一整套技术。优点:
- 自带的功能非常多
缺点:
- 略笨重,类似于航空母舰
特点
完善的文档
经过10多年的发展和完善,Django有广泛的应用和完善的在线文档,开发者遇到问题时可以搜索在线文档寻求解决方案。
集成数据访问组件
Django的Model层自带数据库ORM组件,使开发者无须学习其他数据库访问技术(dbi、SQLAlchemy等)。
强大的URL映射技术
Django使用正则表达式管理URL映射,因此给开发者带来了极高的灵活性。
后台管理系统自动生成
开发者只需通过简单的几行配置和代码就可以实现完整的后台数据管理Web控制台。
错误信息非常完整
在开发调试过程中如果出现运行异常,则Django可以提供非常完整的错误信息帮助开发者定位问题,比如缺少xxx组件的配置引用等,这样可以使开发者马上改正错误。
组成结构
Django是遵循MVC架构的Web开发框架,其主要由以下几部分组成。
管理工具(Management):一套内置的创建站点、迁移数据、维护静态文件的命令工具。
模型(Model):提供数据访问接口和模块,包括数据字段、元数据、数据关系等的定义及操作。
视图(View):Django的视图层封装了HTTP Request和Response的一系列操作和数据流,其主要功能包括URL映射机制、绑定模板等。
模板(Template):是一套Django自己的页面渲染模板语言,用若干内置的tags和filters定义页面的生成方式。
表单(Form):通过内置的数据类型和控件生成HTML表单。
管理站(Admin):通过声明需要管理的Model,快速生成后台数据管理网站。
Flask
Flask是Python Web框架族里比较年轻的一个,于2010年出现,这使得它吸收了其他框架的优点,并且把自己的主要领域定义在了微小项目上。
同时,它是可扩展的,Flask让开发者自己选择用什么数据库插件存储他们的数据。
很多功能简单但性能卓越的网站就是基于Flask框架而搭建的,比如flask官网(https://flask.palletsprojects.com/en/3.0.x/)就是基于flask搭建的。
Flask是一个面向简单需求和小型应用的微框架。
特点
内置开发服务器和调试器
网络程序调试是在将编制好的网站投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程。
有经验的开发者都知道,这是保证网站系统能够正式应用的必要步骤。
Flask 自带的开发服务器使开发者在调试程序时无须再安装其他任何网络服务器,比如Tomcat、JBoss、Apache等。
Flask默认处于调试状态,使得运行中的任何错误会同时向两个目标发送信息:
一个是Python Console,即启动Python程序的控制台;
另一个是HTTP客户端,即Flask开发服务器将调试信息传递给了客户端。
与Python单元测试功能无缝衔接
单元测试是对最小软件开发单元的测试,其重点测试程序的内部结构,主要采用白盒测试方法,由开发人员负责。
单元测试的主要目标是保证函数在给定的输入状态下,能够得到预想的输出,在不符合要求时能够提醒开发人员进行检查。
Flask提供了一个与Python自带的单元测试框架unitest无缝衔接的测试接口,即Flask对象的test_client()函数。
通过test_client()函数,测试程序可以模拟进行HTTP访问的客户端来调用Flask路由处理函数,并且获取函数的输出来进行自定义的验证。
使用Jinja2
模板
将HTML页面与后台应用程序联系起来一直是网站程序框架的一个重要目标。
Flask通过使用Jinja2模板技术解决了这个问题。
Jinja2是一个非常灵活的HTML模板技术,它是从Django模板发展而来的,但是比Django模板使用起来更加自由且更加高效。
Jinja2模板使用配制的语义系统,提供灵活的模板继承技术,自动抗击XSS跨站攻击并且易于调试。
完全兼容WSGI 1.0
标准
WSGI(Web Server Gateway Interface)具有很强的伸缩性且能运行于多线程或多进程环境下,因为Python线程全局锁的存在,使得WSGI的这个特性至关重要。
WSGI已经是Python界的一个主要标准,各种大型网路服务器对其都有良好的支持。
WSGI位于Web应用程序与Web服务器之间,与WSGI完全兼容使得Flask能够配置到各种大型网络服务器中。
基于Unicode编码
Flask是完全基于Unicode的。这对制作非纯ASCII字符集的网站来说非常方便。
HTTP本身是基于字节的,也就是说任何编码格式都可以在HTTP中传输。
但是,HTTP要求在HTTP Head中显式地声明在本次传输中所应用的编码格式。
在默认情况下,Flask会自动添加一个UTF-8编码格式的HTTP Head,使程序员无须担心编码的问题。
Tornado
Tornado是使用Python编写的一个强大的可扩展的Web服务器。
它在处理高网络流量时表现得足够强健,却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中。
Tornado作为FriendFeed网站的基础框架,于2009年9月10日发布,目前已经获得了很多社区的支持,并且在一系列不同的场合中得到应用。
除FriendFeed和Facebook外,还有很多公司在生产上转向Tornado,包括Quora、Turntable.fm、Bit.ly、Hipmunk及MyYearbook等。
特点
完备的Web框架:与Django、Flask等一样,Tornado也提供了URL路由映射、Request上下文、基于模板的页面渲染技术等开发Web应用的必备工具。
是一个高效的网络库,性能与Twisted、Gevent等底层Python框架相媲美:提供了异步I/O支持、超时事件处理。这使得Tornado除了可以作为Web应用服务器框架,还可以用来做爬虫应用、物联网关、游戏服务器等后台应用。
提供高效HTTPClient:除了服务器端框架,Tornado还提供了基于异步框架的HTTP客户端。
提供高效的内部HTTP服务器:虽然其他Python网络框架(Django、Flask)也提供了内部HTTP服务器,但它们的HTTP服务器由于性能原因只能用于测试环境。而Tornado的HTTP服务器与Tornado异步调用紧密结合,可以直接用于生产环境。
完备的WebSocket支持:WebSocket是HTML5的一种新标准,实现了浏览器与服务器之间的双向实时通信。
Fastapi
FastAPI 是一个现代 Web 框架,速度相对较快,用于基于标准 Python 类型提示使用 Python 3.7+ 构建 API。
FastAPI还帮助我们自动为我们的Web服务生成文档,以便其他开发人员可以快速了解如何使用它。
FastAPI 具有许多功能,例如它可以显着提高开发速度,还可以减少代码中的人为错误。
它很容易学习并且完全可以用于生产。
FastAPI 与众所周知的 API 标准(即OpenAPI 和JSON schema)完全兼容。
特点
自动文档
FastAPI 使用 OpenAPI 标准自动生成交互式 API 文档。
可以通过访问应用程序中的特定端点来访问此文档,这使得理解和测试 API 变得非常容易,而无需手动编写大量文档。
Python 类型提示
FastAPI 的突出功能之一是它使用 Python 类型提示。
通过使用类型提示注释函数参数和返回类型,不仅可以提高代码可读性,还可以使 FastAPI 自动验证传入数据并生成准确的 API 文档。
此功能使我们的代码不易出错并且更加自我记录。
数据验证
FastAPI 使用 Pydantic 模型进行数据验证。
可以使用 Pydantic 的架构和验证功能定义数据模型。
这可确保传入数据自动验证、序列化和反序列化,从而降低在应用程序中处理无效数据的风险。
异步支持
随着Python异步编程的兴起,FastAPI完全拥抱异步操作。
可以使用Python的async和await关键字来编写异步端点,使其非常适合处理I/O密集型任务并提高应用程序的整体响应能力。
依赖注入
FastAPI
支持依赖注入,允许声明端点的依赖关系。
这有助于保持代码模块化、可测试和可维护。
我们可以将数据库连接、身份验证等依赖项无缝地注入到的路由中。
安全功能
FastAPI
包含各种开箱即用的安全功能,例如对OAuth2
、JWT
(JSON Web
令牌)的支持以及请求数据的自动验证,以防止SQL
注入和跨站点脚本 (XSS
)攻击等常见安全漏洞。
python框架官网(部分)
框架的核心逻辑几乎是一致的 我们在学习的时候只需要先学会一种之后就可以触类旁通
Django框架官网
Flask框架官网
Fastapi框架官网
Pyramind框架官网
Tornado框架官网
Sanic框架官网
Fastapi框架官网
Aiohttp框架官网