网络框架及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 包含各种开箱即用的安全功能,例如对 OAuth2JWTJSON Web 令牌)的支持以及请求数据的自动验证,以防止 SQL 注入和跨站点脚本 (XSS)攻击等常见安全漏洞。

python框架官网(部分)

框架的核心逻辑几乎是一致的 我们在学习的时候只需要先学会一种之后就可以触类旁通

Django框架官网

Flask框架官网

Fastapi框架官网

Pyramind框架官网

Tornado框架官网

Sanic框架官网

Fastapi框架官网

Aiohttp框架官网

框架和MVC架构的更多相关文章

  1. 从MVC框架看MVC架构的设计

    尽管MVC早已不是什么新鲜话题了,但是从近些年一些优秀MVC框架的设计上,我们还是会发现MVC在架构设计上的一些新亮点.本文将对传统MVC架构中的一些弊病进行解读,了解一些优秀MVC框架是如何化解这些 ...

  2. 从MVC框架看MVC架构的设计(转)

    尽管MVC早已不是什么新鲜话题了,但是从近些年一些优秀MVC框架的设计上,我们还是会发现MVC在架构设计上的一些新亮点.本文将对传统MVC架构中的一些弊病进行解读,了解一些优秀MVC框架是如何化解这些 ...

  3. MVC架构模式详细说明

    一.简介: 架构模式是一个通用的.可重用的解决方案,用于在给定上下文中的软件体系结构中经常出现的问题.架构模式与软件设计模式类似,但具有更广泛的范围. 模型-视图-控制器模式,也称为MVC模式(Mod ...

  4. go区块链学习教程之iris框架mvc架构

    在Iris框架中,封装了mvc包作为对mvc架构的支持,方便开发者遵循mvc的开发原则进行开发. iris框架支持请求数据.模型.持久数据分层处理,并支持各层级模块代码绑定执行. MVC即:model ...

  5. 架构(三层架构)、框架(MVC)、设计模式三者异同点

    前言: 本博客主要针对架构.框架和设计模式三者的区别.还有三层和MVC的区别进行讨论.对于这三者一点都不了解的.请点在维基和百度百科上补补课.这里就不发链接了 软件架构(software archit ...

  6. Spring 框架基础(06):Mvc架构模式简介,执行流程详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.SpringMvc框架简介 1.Mvc设计理念 MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集 ...

  7. java:(九大内置对象,计算服务器访问次数,filter过滤器,MVC框架,MVC和三层架构的关系)

    1.九大内置对象: <%@ page language="java" import="java.util.*" pageEncoding="UT ...

  8. 【JAVA】基于MVC架构Java技术荟萃案例演练

    基于JAVA-MVC技术的顾客管理项目案例总结 作者 白宁超 2016年6月9日22:47:08 阅读前瞻:本文源于对javaweb相关技术和资料汇总,涉及大量javaweb基础技术诸如:Servle ...

  9. IntelliMVCCode智能MVC架构的代码助手使用方法

    智能代码生成工具,快速帮助开发者提升开发速度,通过工具自动生成MVC架构的大量源代码,节省更多的开发时间. 工具使用的框架:.net4.0,通过工具连接到数据库自动提取数据表或视图中的结构,生成对应的 ...

  10. 一个初学者对于MVC架构的理解

    我很早之前就开始接触.NET开发,一直都在2.0的框架下,所以对于MVC这种架构,听说过,但没有具体使用过,近期和外部朋友接触时,有了解到他们公司在使用MVC这种架构,所以自己就找来相关资料了解一下M ...

随机推荐

  1. [转帖]并发控制- sched_yield 函数

    函数说明 函数原型 #include <sched.h> int sched_yield(void); 1 2 sched_yield的作用是让出处理器,调用时会导致当前线程放弃CPU,进 ...

  2. [转帖]Nginx(3):上手Nginx,从配置文件开始

    https://cloud.tencent.com/developer/article/1886147?areaSource=&traceId=   其实吧,我配置 tcp 负载均衡的时候也就 ...

  3. [转贴]更改 CMD 编码(解决 VSJupyter 乱码)

    https://zhuanlan.zhihu.com/p/521376336 以 将编码更改为 UTF-8 为例 1. 临时修改编码 运行 CMD 输入 chcp 查看当前的代码页 (代码页和国家/地 ...

  4. 程序启停分析与进程常用API的使用

    进程是程序运行的实例,操作系统为进程分配独立的资源,使之拥有独立的空间,互不干扰. 空间布局 拿c程序来说,其空间布局包括如下几个部分: 数据段(初始化的数据段):例如在函数外的声明,int a = ...

  5. (数据科学学习手札157)pandas新增case_when方法

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,pandas在前不久更新的2. ...

  6. 【springboot整合druid】java.sql.SQLException: url not set

    问题描述 未使用自动装配的机制,实现springboot整合druid时(就是使用druid的jar包,而不是druid-spring-boot-starter)报错 <dependency&g ...

  7. 通过docker-compose搭建mongo的replica set高可用

    通过docker-compose搭建mongo的replica set高可用 前言 备份数据 备份数据到本地 数据恢复 集群搭建 生成keyFile 创建yml文件 初始化副本集 增加副本集 将节点初 ...

  8. LyScript 计算片段Hash并写出Excel

    本案例将学习运用LyScript计算特定程序中特定某些片段的Hash特征值,并通过xlsxwriter这个第三方模块将计算到的hash值存储成一个excel表格,本例中的知识点可以说已经具备了简单的表 ...

  9. JWT( JSON Web Token —— JSON Web 令牌 )的学习笔记

    一.跨域认证的问题 互联网服务离不开用户认证.一般流程是下面这样: 1.用户向服务器发送用户名和密码. 2.服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色.登录时间等等. ...

  10. vscode连不上云服务器,一直报超时错误|但是xshell那些又可以连上?为什么vscode连不上?|命令行输出管道报错 -bash: command not found 导致的一系列问题

    前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总https://blog.cs ...