本文内容摘录自《Python高效开发实战——Django、Tornado、Flask、Twisted》一书。该书分为三部分:第1部分是基础篇,带领初学者实践Python开发环境和掌握基本语法,同时对网络协议、Web客户端技术、数据库建模编程等网络编程基础深刻浅出地进行学习;第2部分是框架篇,学习当前最流行的Python Web框架,即Django、Tornado、Flask和Twisted,达到对各类Python网络技术融会贯通的目的;第3部分是实战篇,分别对4种框架进行项目实践,利用其各自的特色开发适用于不一样场景的网络程序。
目前Python的网络编程框架已经多达几十个,逐个学习它们显然不现实。但这些框架在系统架构和运行环境中有不少共通之处,本文带领读者学习基于Python网络框架开发的经常使用知识,及目前的4种主流Python网络框架:Django、Tornado、Flask、Twisted。java
所谓网络框架是指这样的一组Python包,它可以使开发者专一于网站应用业务逻辑的开发,而无须处理网络应用底层的协议、线程、进程等方面。这样能大大提升开发者的工做效率,同时提升网络应用程序的质量。python
在目前Python语言的几十个开发框架中,几乎全部的全栈网络框架都强制或引导开发者使用MVC架构开发Web应用。所谓全栈网络框架,是指除了封装网络和线程操做,还提供HTTP栈、数据库读写管理、HTML模板引擎等一系列功能的网络框架。本文重点讲解的Django、Tornado和Flask是全栈网络框架的典型标杆;而Twisted更专一于网络底层的高性能封装而不提供HTML模板引擎等界面功能,因此不能称之为全栈框架。程序员
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做为数据中心。浏览器
这3个基本部分互相分离,使得在改进和升级界面及用户交互流程时,不须要重写业务逻辑及数据访问代码。MVC架构如图1所示。服务器
MVC架构图网络
注意:MVC在除Python外的其余语言中也有普遍应用,例如VC++的MFC、Java的Structs及Spring、C#的.NET开发框架,读者应该有深入的体会。
4种Python网络框架:Django、Tornado、Flask、Twisted多线程
接下来带领你们学习当今主流的4种Python网络框架。
Django于2003年诞生于美国堪萨斯(Kansas)州,最初用来制做在线新闻Web站点,于2005年加入了BSD许可证家族,成为开源网络框架。Django根据比利时的爵士音乐家Django Reinhardt命名,做者这样命名Django意味着Django能优雅地演奏(开发)功能丰富的乐曲(Web应用)。
它是当前Python世界里最负盛名且最成熟的网络框架。最初用来制做在线新闻的Web站点,目前已发展为应用最普遍的Python网络框架。Django的各模块之间结合得比较紧密,因此在功能强大的同时又是一个相对封闭的系统,可是其健全的在线文档及开发社区,使开发者在遇到问题时能找到解决方法。
Django框架的特色
相对于Python的其余Web框架,Django的功能是最完整的,Django定义了服务发布、路由映射、模板编程、数据处理的一整套功能。这也意味着Django模块之间紧密耦合,开发者须要学习Django本身定义的这一整套技术。Django的主要特色以下。
完善的文档:通过10多年的发展和完善,Django有普遍的应用和完善的在线文档,开发者遇到问题时能够搜索在线文档寻求解决方案。
集成数据访问组件:Django的Model层自带数据库ORM组件,使开发者无须学习其余数据库访问技术(dbi、SQLAlchemy等)。
强大的URL映射技术:Django使用正则表达式管理URL映射,所以给开发者带来了极高的灵活性。
后台管理系统自动生成:开发者只需经过简单的几行配置和代码就能够实现完整的后台数据管理Web控制台。
错误信息很是完整:在开发调试过程当中若是出现运行异常,则Django能够提供很是完整的错误信息帮助开发者定位问题,好比缺乏xxx组件的配置引用等,这样可使开发者立刻改正错误。
Django的组成结构
Django是遵循MVC架构的Web开发框架,其主要由如下几部分组成。
管理工具(Management):一套内置的建立站点、迁移数据、维护静态文件的命令工具。
模型(Model):提供数据访问接口和模块,包括数据字段、元数据、数据关系等的定义及操做。
视图(View):Django的视图层封装了HTTP Request和Response的一系列操做和数据流,其主要功能包括URL映射机制、绑定模板等。
模板(Template):是一套Django本身的页面渲染模板语言,用若干内置的tags和filters定义页面的生成方式。
表单(Form):经过内置的数据类型和控件生成HTML表单。
管理站(Admin):经过声明须要管理的Model,快速生成后台数据管理网站。
Tornado是使用Python编写的一个强大的可扩展的Web服务器。它在处理高网络流量时表现得足够强健,却在建立和编写时有着足够的轻量级,并可以被用在大量的应用和工具中。Tornado做为FriendFeed网站的基础框架,于2009年9月10日发布,目前已经得到了不少社区的支持,而且在一系列不一样的场合中获得应用。除FriendFeed和Facebook外,还有不少公司在生产上转向Tornado,包括Quora、Turntable.fm、Bit.ly、Hipmunk及MyYearbook等。
相对于其余Python网络框架,Tornado有以下特色。
完备的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的一种新标准,实现了浏览器与服务器之间的双向实时通讯。
由于Tornado的上述特色,Tornado常被用做大型站点的接口服务框架,而不像Django那样着眼于创建完整的大型网站,因此本章着重讲解Tornado的异步及协程编程、身份认证框架、独特的非WSGI部署方式。
Flask是Python Web框架族里比较年轻的一个,于2010年出现,这使得它吸取了其余框架的优势,而且把本身的主要领域定义在了微小项目上。同时,它是可扩展的,Flask让开发者本身选择用什么数据库插件存储他们的数据。不少功能简单但性能卓越的网站就是基于Flask框架而搭建的,好比http://httpbin.org/就是一个功能简单但性能强大的HTTP测试项目。Flask是一个面向简单需求和小型应用的微框架。
相对于其余Python语言的Web框架而言,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,使程序员无须担忧编码的问题。
以上讲到的3个Python Web框架都是围绕着应用层HTTP展开的,而Twisted是一个例外。Twisted是一个用Python语言编写的事件驱动的网络框架,对于追求服务器程序性能的应用,Twisted框架是一个很好的选择。
Twisted是一个有着10多年历史的开源事件驱动框架。Twisted支持不少种协议,包括传输层的UDP、TCP、TLS,以及应用层的HTTP、FTP等。对于全部这些协议,Twisted提供了客户端和服务器方面的开发工具。
Twisted框架的历史悠久,其主要发行版本都以Python 2为基础,最新的版本为基于Python 2.7的Twisted-15.4.0。Twisted社区正在开发基于Python 3的版本,但目前为止尚没有基于Python 3的Twisted稳定发行版。
Twisted是一个高性能的编程框架。在不一样的操做系统平台上,Twisted利用不一样的底层技术实现了高效能通讯。在Windows中,Twisted的实现基于I/O完成端口(IOCP,Input/Output Completion Port)技术,它保证了底层高效地将I/O事件通知给框架及应用程序;在Linux中,Twisted的实现基于epoll技术,epoll是Linux下多路复用I/O接口select/poll的加强版本,它能显著提升程序在大量并发链接中只有少许活跃的状况下的系统CPU利用率。
在开发方法上,Twisted引导程序员使用异步编程模型。Twisted提供了丰富的Defer、Threading等特性来支持异步编程。
欲进一步了解Python四大主流网络编程框架的编程方法、项目实战,可参见《Python高效开发实战——Django、Tornado、Flask、Twisted》一书。
做者:陈秋歌
原文:
https://blog.csdn.net/chenqiuge1984/article/details/80127498
识别图中二维码,欢迎关注python宝典