Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

2022-10-24,,,,

Django 与 Tornado 各自的优缺点
Django
优点:

大和全(重量级框架
自带orm,template,view 
需要的功能也可以去找第三方的app
注重高效开发
全自动化的管理后台(只需要使用起ORM,做简单的定义,就能自动生成数据库结构,全功能的管理后台)
session功能
缺点:

template不怎么好用(来自自身的缺点)
数据库用nosql不方便(来自自身的缺点)
如果功能不多,容易臃肿

Tornado
优点:

少而精(轻量级框架)
注重性能优越,速度快
解决高并发(请求处理是基于回调的非阻塞调用)
异步非阻塞
websockets 长连接
内嵌了HTTP服务器
单线程的异步网络程序,默认启动时根据CPU数量运行多个实例;利用CPU多核的优势
自定义模块
缺点:

模板和数据库部分有很多第三方的模块可供选择,这样不利于封装为一个功能模块

总结:
要性能, Tornado 首选;要开发速度,Django 和 Flask 都行,区别是 Flask 把许多功能交给第三方库去完成了,因此 Flask 更为灵活。

综上所述:
Django适合初学者或者小团队的快速开发,适合做管理类、博客类网站、或者功能十分复杂需求十分多的网站

Tornado适合高度定制,适合访问量大,异步情况多的网站

Django 概述
Django 应该是最出名的python框架,Google App Engine甚至Erlang都有框架受它影响。
Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构、以及全功能的管理后台。
Django提供的方便,也意味着Django内置的ORM跟框架内的其他模块耦合程度高。
应用程序必须使用Django内置的ORM,否则就不能享受到框架内提供的种种基于其ORM的便利;理论上可以切换掉其ORM模块,但这就相当于要把装修完毕的房子拆除重新装修,倒不如一开始就去毛胚房做全新的装修。
Django的卖点是超高的开发效率,其性能扩展有限;采用Django的项目,在流量达到一定规模后,都需要对其进行重构,才能满足性能的要求。
Ruby的Rails也有类似的问题;以Twitter为例,推特到了今日的规模,不要说Rails,甚至是连Ruby都需要抛弃重来。
就我的感觉Django适用的是中小型的网站,或者是作为大型网站快速实现产品雏形的工具。

Tornado 概述
Tornado是Facebook开源出来的框架,其哲学跟Django近乎两个极端。Tornado是异步框架Tornado基本上只算有MVC中C这一层
Tornado走的是少而精的方向,它也有提供模板功能;虽然不鼓励,但作者是可以允许在模板进行少量编码的。
如果跟asp.net相比,Tornado有点类似仅实现了AsyncHttpHandler;除此之外,全部需要自己去实现。
好吧,其实它有模板,有国际化支持,甚至还有内置的OAuth/OpenID模块,方便做第三方登录,它其实也直接实现了Http服务器。
但它没有ORM(仅有一个mysql的超简单封装),甚至没有Session支持,更不要说Django那样自动化的后台。
假设是一个大型网站,在高性能的要求下,框架的各个部分往往都需要定制,可以复用的模块非常少;一个以Django开发的网站,各部分经过不断的定制,Django框架剩下的,很有可能也就是tornado一开始所能提供的这部分。
殊途同归。

===== HTTP服务器 =====
Tornado为了高效实现Comet/后端异步调用HTTP接口,是直接内嵌了HTTP服务器。
前端无需加apache / lighttpd / nginx等也可以供浏览器访问;但它并没有完整实现HTTP 1.1的协议,所以官方文档是推荐用户在生产环境下在前端使用nginx,后端反向代理到多个Tornado实例。
Tornado本身是单线程的异步网络程序,它默认启动时,会根据CPU数量运行多个实例;充分利用CPU多核的优势。

===== 单线程异步 =====
网站基本都会有数据库操作,而Tornado是单线程的,这意味着如果数据库查询返回过慢,整个服务器响应会被堵塞。
数据库查询,实质上也是远程的网络调用;理想情况下,是将这些操作也封装成为异步的;但Tornado对此并“没有”提供任何支持。
这是Tornado的“设计”,而不是缺陷。
一个系统,要满足高流量;是必须解决数据库查询速度问题的!
数据库若存在查询性能问题,整个系统无论如何优化,数据库都会是瓶颈,拖慢整个系统!
异步并**不能**从本质上提到系统的性能;它仅仅是避免多余的网络响应等待,以及切换线程的CPU耗费。
如果数据库查询响应太慢,需要解决的是数据库的性能问题;而不是调用数据库的前端Web应用。
对于实时返回的数据查询,理想情况下需要确保所有数据都在内存中,数据库硬盘IO应该为0;这样的查询才能足够快;而如果数据库查询足够快,那么前端web应用也就无将数据查询封装为异步的必要。
就算是使用协程,异步程序对于同步程序始终还是会提高复杂性;需要衡量的是处理这些额外复杂性是否值得。
如果后端有查询实在是太慢,无法绕过,Tornaod的建议是将这些查询在后端封装独立封装成为HTTP接口,然后使用Tornado内置的异步HTTP客户端进行调用。

Django是基于python的web框架,直接使用了WSGI,

Django请求流程

1.用户通过浏览器发送请求

2.请求到达request中间件,中间件对request请求做预处理或者直接返回response

3.若未返回response,会到达urlconf路由,找到对应视图函数

4.视图函数做相应预处理或直接返回response

5.View中的方法可以选择性的通过Models访问底层的数据

6.取到相应数据后回到django模板系统,templates通过filter或tags把数据渲染到模板上

7.返回response到浏览器展示给客户

上述流程中最主要的几个部分分别是:Middleware(中间件,包括request, view, exception, response),URLConf(url映射关系),Template(模板系统

 

注重高效开发

全自动化的管理后台(只需要使用起ORM,做简单的定义,就能自动生成数据库结构,全功能的管理后台)

session功能

django的优点在于 大和全 ,orm,template,view 都自带了。需要的功能也可以去找第三方的app。  缺点嘛也就是自身的一些缺点,template不怎么好用,数据库用nosql不方便等。

Tornado

注重性能优越,速度快

解决高并发

异步非阻塞

websockets 长连接

内嵌了HTTP服务器

单线程的异步网络程序,默认启动时根据CPU数量运行多个实例;利用CPU多核的优势。

tornado的模板感觉更简单点。而且请求处理是基于回调的非阻塞调用,这样能提高并发量。 模板和数据库部分有很多第三方的模块可供选择,这样不利于封装为一个功能模块。缺点倒也不至于,因为本来就打算成为一个轻量级的框架吧

1.要性能, Tornado 首选;要开发速度,Django 和 Flask 都行,区别是 Flask 把许多功能交给第三方库去完成了,因此 Flask 更为灵活。

2.Tornado实现了异步机制,Django没有。

3.Django适合初学者或者小团队,Tornado适合高度定制。

1,tornado:是python编写的web服务器兼容web应用的框架。

tornado的优势

(1),轻量级的web框架

(2),他提供了一种带有异步功能并允许他扩展到大量开放连接的简单的web框架。

(3),出色的坑负载能力

(4),优异的处理性能,不依赖多线程/多进程。

(5),wsgi全栈替代产品,推荐同时使用其web框架和http服务器。

2,Django框架

Django:是重量级的web框架,功能大而且全,可以高效开发。

原因:

(1),内置的管理后台

(2),内置封装完善的ORM操作

(3),session功能,

(4),后台管理

(5)HTTP服务器

(6),异步编程

从数据库来说

django有自己的ORM,而tornado的torndb不是很强大,所以一般都使用sqlalchemy

从视图上来说

django可以用form做一些验证

render中django没有tornado可以传的参数类型多

性能上来说

tornado由于是单线程异步回调的模式,所以比django的并发要高

django是多线程但是没有做异步,所以要比tornado的并发低

从提供的插件上来说

django提供了ORM,django.core.mail,django crontab,等等

 
 

Python几种主流框架

从GitHub中整理出的15个最受欢迎的Python开源框架。这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等。

Django: Python Web应用开发框架
Django 应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响。Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构、以及全功能的管理后台。

Diesel:基于Greenlet的事件I/O框架
Diesel提供一个整洁的API来编写网络客户端和服务器。支持TCP和UDP。

Flask:一个用Python编写的轻量级Web应用框架
Flask是一个使用Python编写的轻量级Web应用框架。基于Werkzeug WSGI工具箱和Jinja2 
模板引擎。Flask也被称为“microframework”,因为它使用简单的核心,用extension增加其他功能。Flask没有默认使用的数
据库、窗体验证工具。

Cubes:轻量级Python OLAP框架
Cubes是一个轻量级Python框架,包含OLAP、多维数据分析和浏览聚合数据(aggregated data)等工具。

Kartograph.py:创造矢量地图的轻量级Python框架
Kartograph是一个Python库,用来为ESRI生成SVG地图。Kartograph.py目前仍处于beta阶段,你可以在virtualenv环境下来测试。

Pulsar:Python的事件驱动并发框架
Pulsar是一个事件驱动的并发框架,有了pulsar,你可以写出在不同进程或线程中运行一个或多个活动的异步服务器。

Web2py:全栈式Web框架
Web2py是一个为Python语言提供的全功能Web应用框架,旨在敏捷快速的开发Web应用,具有快速、安全以及可移植的数据库驱动的应用,兼容Google App Engine。

Falcon:构建云API和网络应用后端的高性能Python框架
Falcon是一个构建云API的高性能Python框架,它鼓励使用REST架构风格,尽可能以最少的力气做最多的事情。

Dpark:Python版的Spark
DPark是Spark的Python克隆,是一个Python实现的分布式计算框架,可以非常方便地实现大规模数据处理和迭代计算。DPark由豆瓣实现,目前豆瓣内部的绝大多数数据分析都使用DPark完成,正日趋完善。

Buildbot:基于Python的持续集成测试框架
Buildbot是一个开源框架,可以自动化软件构建、测试和发布等过程。每当代码有改变,服务器要求不同平台上的客户端立即进行代码构建和测试,收集并报告不同平台的构建和测试结果。

Zerorpc:基于ZeroMQ的高性能分布式RPC框架
Zerorpc是一个基于ZeroMQ和MessagePack开发的远程过程调用协议(RPC)实现。和 Zerorpc 一起使用的 Service API 被称为 zeroservice。Zerorpc 可以通过编程或命令行方式调用。

Bottle: 微型Python Web框架
Bottle是一个简单高效的遵循WSGI的微型python Web框架。说微型,是因为它只有一个文件,除Python标准库外,它不依赖于任何第三方模块。

Tornado:异步非阻塞IO的Python Web框架
Tornado的全称是Torado Web Server,从名字上看就可知道它可以用作Web服务器,但同时它也是一个Python Web的开发框架。最初是在FriendFeed公司的网站上使用,FaceBook收购了之后便开源了出来。

webpy: 轻量级的Python Web框架
webpy的设计理念力求精简(Keep it simple and powerful),源码很简短,只提供一个框架所必须的东西,不依赖大量的第三方模块,它没有URL路由、没有模板也没有数据库的访问。

Scrapy:Python的爬虫框架
Scrapy是一个使用Python编写的,轻量级的,简单轻巧,并且使用起来非常的方便。

2018年Python web五大主流框架

2018年07月16日 07:20:00 IT派 阅读数:1167
 

我们都知道风靡一时的Python语言作为人工智能战场上主要使用的枪外,还被广泛应用在Web开发、游戏开发、人工智能、云计算开发、大数据开发、数据分析、科学运算、爬虫、自动化运维、自动化测试等领域,其实Python在各领域的应用最方便的就是使用框架,可以让程序员以更少的代码实现自定义功能,还可以将更多的精力集中在业务逻辑上,更加的轻松便利!那么2018年Python web五大主流框架,你知道吗?

序言:

现在很多学习Python的人员更多的是趋向于爬虫、人工智能、数据分析等,Python web开发确实这些方向工作岗位最多的一个!曾经有一位老前辈和说到“Python web开发堪称全能”。

他说:

如果你会Python web开发,那么

你在制造行业,就是做ERP系统开发;

你在电商行业,就是做电商平台;

你在游戏行业,就是做游戏后台开发;

你在金融行业,就是做量化交易;

你在.......行业,就是做.................................

既然Python web这么厉害,那么我们了解2018Python主流的五大框架也就显得很有必要了:

1.Django

Django是一个开源的Web应用框架,由Python写成,支持许多数据库引擎,可以让Web开发变得迅速和可扩展,并会不断的版本更新以匹配Python最新版本,如果是新手程序员,可以从这个框架入手。

2.Flask

Flask是一个轻量级的Web应用框架, 使用Python编写。基于 WerkzeugWSGI工具箱和 Jinja2模板引擎。使用 BSD 授权。

Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。然而,Flask保留了扩增的弹性,可以用Flask-extension加入这些功 能:ORM、窗体验证工具、文件上传、各种开放式身份验证技术。

3.Web2py

Web2py是一个用Python语言编写的免费的开源Web框架,旨在敏捷快速的开发Web应用,具有快速、可扩展、安全以及可移植的数据库驱动的应用,遵循LGPLv3开源协议。

Web2py提供一站式的解决方案,整个开发过程都可以在浏览器上进行,提供了Web版的在线开发,HTML模版编写,静态文件的上传,数据库的编写的功能。其它的还有日志功能,以及一个自动化的admin接口。

4.Tornado

Tornado即是一个Web server(对此本文不作详述),同时又是一个类web.py的micro-framework,作为框架Tornado的思想主要来源于Web.py,大家在Web.py的网站首页也可以看到Tornado的大佬Bret Taylor的这么一段话(他这里说的FriendFeed用的框架跟Tornado可以看作是一个东西):

“[web.py inspired the] Web framework we use at FriendFeed [and] the webapp framework that ships with App Engine…”

因为有这层关系,后面不再单独讨论Tornado。

5.CherryPy

CherryPy是一种用于Python的、简单而非常有用的Web框架,其主要作用是以尽可能少的操作将Web服务器与Python代码连接,其功能包括内置的分析功能、灵活的插件系统以及一次运行多个HTTP服务器的功能,可与运行在最新版本的Python、Jython、Android上。

最后关于框架选择的误区

在框架的选择问题上,许多人很容易就陷入了下面两个误区中而不自知:

哪个框架最好——世上没有最好的框架,只有最适合你自己、最适合你的团队的框架。编程语言选择也是一个道理,你的团队Python最熟就用Python好了,如果最熟悉的是Ruby那就用Ruby好了,编程语言、框架都只是工具,能多、快、好、省的干完活就是好东西。

过分关注性能——其实大部分人是没必要太关心框架的性能的,因为你开发的网站根本就是个小站,能上1万的IP的网站已经不多了,上10万的更是很少很少。在没有一定的访问量前谈性能其实是没有多大意义的,因为你的CPU和内存一直就闲着呢。

13个Python web框架比较

云计算实践

百家号18-08-2820:41 

Python程序员有很多很好的选择来创建Web应用程序和API;Django,Weppy,Bottle和Flask引领潮流。

如果正在开发一个Web应用程序并且已经选择使用Python作为构建它的语言,那么这是一个明智的选择。Python的开发成熟度,强大的库以及广泛的实际应用使其成为Web开发的必需。

现在是困难的部分:从众多可用的Python web框架中选择一个。它们不仅数量在不断增长,而且很难找到最适合你的。如果你正在构建一个快速而又简单的REST API,那么你将不需要任何完整的面向用户的应用程序所需的管道和连接,该应用程序具有用户登录、表单验证和上传处理就可以了。

在本文中,我们将研究13种最广泛部署的Python web框架。我们将关注每种web应用程序最适合构建哪种类型的web应用程序,并研究它们如何在以下六个方面相互竞争:

安装:设置不需要正式的框架项目(它可以简单地作为包含的模块放到现有的项目中)、启动所需的模板文件最少、或者带有某种预先配置的设置,这是多么容易或简单。

文档:几乎每一个像样的Python项目都有文档,可以遍历设置、演示基本用例并提供关于API的详细信息。在这里,我们给这样的框架更高的分数:这些框架展示了如何在教程中创建整个应用程序,包括常见的配方或设计模式,以及超出职责范围(例如提供有关如何运行的详细信息) Python变体(如PyPy或IronPython)下的框架。

管理:这是相对得分,表示配置和维护框架需要做多少工作。默认情况下,工作量最小的框架得分更高。

原生能力:包含多少组件?得分较高的是那些为国际化,HTML模板和数据访问层提供原生支持的框架。还有一些框架使用Python最近引入的异步I/O操作的原生支持。

安全性:提供原生安全措施(如跨站点请求伪造(CSRF)保护和使用加密cookie的会话管理)的框架获得更高的分数。

可伸缩性:大多数Python框架可以利用像Gevent或Gunicorn这样的项目来大规模运行。在这里,我们看一下提升可伸缩性的框架原生特性,如输出和页面片段缓存。

如果你对性能基准感到好奇,请查看TechEmpower正在进行的一系列试验,这些试验比较了各种任务中的多个Web框架,并将代码和方法发布到GitHub并进行不断的重新评估。并非所有讨论中的框架都在那里进行了分析,但是可以很好地了解哪种框架在哪种负载下表现最佳。

我们将分析13个框架。其中五个:CubicWeb,Django,Web2py,Weppy和Zope2,采用“控件”方法,包含你可以想象的Web应用程序所需的大多数功能。其余八个框架: Bottle,CherryPy,Falcon,Flask,Pyramid,Tornado,Web.py和Wheezy.web,提供更简约的外观,交易批量和完整性,简单易用。

让我们从重量级开始吧。

重量级的Python Web框架

CubicWeb

CubicWeb被称为“一个支持重用和面向对象设计的语义Web应用程序框架。”这是一个有趣的系统,强调使用抽象和可重用的代码块称为“多维数据集”,但对于某些开发人员来说可能过于抽象或特殊。

多维数据集是具有模式(数据模型),实体(编程逻辑)和视图的软件组件。通过组合多个立方体,每个立方体执行自己的任务,可以通过重用自己的代码和其他代码来编写软件应用程序。

CubicWeb的核心是提供每个Web应用程序使用的基本搭建材料:用于数据连接和存储的“存储库”;用于基本HTTP请求/响应和CRUD操作的“Web引擎”;以及用于建模数据的模式。所有这些都在Python类定义中描述。要设置和管理CubicWeb的实例,可以使用类似于Django的命令行工具。

CubicWeb似乎没有使用Python 3的原生异步功能。包含异步的一种迂回方式是使用cubicweb.pyramid模块将Pyramid框架用作Web服务器,并使用异步构造在Pyramid上绘制。但是现在看起来更加直截了当。

要在CubicWeb应用程序中获取或操作持久数据,可以使用关系查询语言(RQL),它采用模糊的SQL语法,但在W3C的SparQL之后进行模式化。CubicWeb的理由再次是抽象:RQL提供了一种高度分离的路径来相互关联各种数据源。但是,随着它的实现,通过手动构建查询作为字符串,它可能会让习惯于ORM的开发人员感到过时。

使用CubicWeb还有其他障碍。首先,设置可能很麻烦。因为CubicWeb有很多依赖项,所以最好使用pip install来获取所有依赖项。可能还必须在本地环境中执行一定数量的手动调整。这与运行pip install或将框架代码放入另一个项目的子文件夹的其他框架形成鲜明对比,这就是所需要的。

另一个潜在的问题是缺少本机模板引擎;生成HTML留给开发人员。可以通过使用像Jinja2这样的第三方模板系统或选择为Web UI提供工具的多维数据集来克服这个问题,例如Boostrap HTML框架的工具。

CubicWeb的一个长期问题,缺乏Python 3支持,目前已经解决。截至2016年6月的版本3.23,CubicWeb支持Python 3,但Twisted等模块本身并未完全移植。

与Web2py一样,CubicWeb将其冗长的文档称为“书籍”。它需要时间来解释CubicWeb的不寻常方法,演示如何构建一些基本应用程序,包括API引用,并且通常不会特定的方式。

Django

自Django首次出现以来已经有十年,它已经成为Python最广泛部署的用于创建Web应用程序的框架之一。 Django配备了你可能需要的大部分组件,因此它倾向于构建大型应用程序而不是小型应用程序。

经过多年在版本1.x后,Django最近在小数点的左边创建了一个版本。 Django 2.0中最大的变化是框架现在只适用于Python 3.4及更高版本。理想情况下,你应该使用Python 3.x,所以使用Django的1.x分支的唯一原因是你遇到了旧版本的Python。

Django吸引力的一个关键部分是部署速度。因为它包含了开发普通Web应用程序所需的许多部分,所以可以快速行动。路由,URL解析,数据库连接(包括ORM),表单验证,攻击保护和模板都是内置的。

将找到最常见的Web应用程序方案的构建块。例如,用户管理可在大多数网站上找到,因此Django将其作为标准元素提供。Django本身具有这些功能,而不必创建自己的系统来跟踪用户帐户,会话,密码,登录/注销,管理员权限等。它们可以按原样使用或扩展,以包含最少量工作的新用例。

核心是BSD,一些组件是LGPLv3。可通过zope.formlib获得;单独安装但作为项目的一部分支持。通过第三方扩展程序提供。

Django具有健全和安全的默认设置,有助于保护Web应用程序免受攻击。将变量放在页面模板中时,例如带有HTML或JavaScript的字符串,除非明确将变量实例指定为安全,否则不会按字面意义呈现内容。这本身就减少了许多常见的跨站脚本问题。如果要执行表单验证,可以使用从简单的CSRF保护到返回详细错误反馈的完整逐个字段验证机制的所有内容。

如果没有强大的文档可以使用像Django那样丰富和广泛的功能。Django的文档站点从多个角度深入研究框架的各个方面。使用Python 3或其他语言,正确的安全性,实现常见的Web应用程序组件(如会话或分页),生成站点地图,它们都被覆盖。还详细描述了应用程序模型,视图和模板的每个层的API。

然而,强大的力量带来了极大的复杂性。Django应用程序以其头重脚轻而闻名,具有许多移动部件。即使只有几条路线的简单Django应用程序也需要相当多的配置才能运行。如果你的工作只是设置几个简单的REST端点,Django几乎肯定是矫枉过正的。

Django也有它的怪癖。例如,页面模板不能使用callables。示例:可以将{{user.name}}作为模板中的组件传递,但不能传递{{user.get_name()}}。这是Django确保模板不会无意中做出令人讨厌的事情的方法之一,但如果你没有为它们做好准备,这些限制可能会很刺激。虽然有解决方法,但它们往往会对性能产生影响。

Django的核心是同步。但是,添加异步行为的一种方法是通过Django Channels项目。这个项目是官方的Django附加组件,它为Django添加了对连接和套接字的异步处理,同时保留了Django的编程习惯用法。

web2py

在Ruby世界中,Ruby on Rails是事实上的Web框架。DePaul大学计算机科学教授Massimo Di Pierro受到Rails的启发,用Python创建一个易于设置和使用的Web框架。结果是Web2py。

Web2py最大的吸引力在于其内置的开发环境。当设置Web2py实例时,将获得一个Web界面,实际上是一个在线Python应用程序编辑器,可以在其中配置应用程序的组件。这通常意味着创建模型,视图和控制器,每个都通过Python模块或HTML模板进行描述。一些示例应用程序随附Web2py。可以将它们分开来查看它们的工作方式,或将它们用作启动器模板来创建自己的应用程序。

开发人员通常只需下载源代码并使用它来部署Web2py。但对于Windows或MacOS上技术含量较低的用户,Web2py的创建者提供的版本基本上是独立服务器。下载,解压缩并运行其中一个版本,将拥有一个内置Web2py预配置副本的本地Web服务器。这是一个很好的方法来创建一个Web2py应用程序,然后可以部署其他地方。

Web2py的Web界面是使用Bootstrap 2.16.1构建的,因此它易于操作并且易于导航。浏览器内编辑器不能替代完整的IDE,但它配备了有用的辅助工具,如行编号和Python语法高亮(包括自动缩进)。还包括一个Python shell的快速Web界面,因此如果需要,可以从命令行与Web2py交互,这对专家来说是一个很好的让步。

Web2py中使用的数据抽象系统与Django的ORM和受其启发的其他ORM(例如Peewee)略有不同。这些系统使用Python类来定义模型,在Web2py中,使用构造函数(如define_table)来实例化模型。这些差异中的大部分可能只会对那些已经有过经验并且开始使用另一个的人产生震动;他们对新人来说同样复杂。将Web2py连接到数据提供者可能不会遇到任何麻烦,因为它几乎涉及现有的每个主要数据库。

一个真正有用的数据库相关功能是生成模型图的能力,更好地可视化模型之间的相互关系。但是,需要安装pygraphviz库才能启用该功能。

Web2py通过对jQuery和AJAX的集成支持,提供许多其他专业级组件:国际化功能,多种缓存方法,访问控制和授权,甚至前端效果(例如,表单中的日期选择器)。虽然不允许使用中间件来替换核心Web2py功能,但也包括外部和内部中间件的挂钩。

Web2py的一个重要限制是它仅与Python 2.x兼容。首先,这意味着Web2py无法使用Python 3的异步语法。如果你依赖于Python 3独有的外部库,那么你就不走运了。但是,正在开展使Web2py Python 3兼容的工作,并且在撰写本文时它已接近完成。

毫无疑问,Web2py的文档被称为“书”。首先,它涵盖了Web2py,Python以及用于这两者的部署环境的大量材料。其次,它以高度可访问的叙事风格书写。第三,它深入讨论了常见的应用程序构建方案。例如,有一整章使用jQuery(与Web2Py捆绑在一起)来构建AJAX应用程序。

Weppy

Weppy感觉就像Flask的简约风格和Django的完整性之间的中间标记。虽然开发Weppy应用程序具有Flash的直接性,但Weppy具有Django中的许多功能,如数据层和身份验证。因此,Weppy适用于从极其简单到适度复杂的应用程序。

乍一看,Weppy代码看起来很像Flask或Bottle代码。启动和运行基本的单路网站需要很少的指示。路径可以通过函数装饰器(简单方法)或以编程方式描述,并且这样做的语法与Flask/Bottle密切相关。除了语法的微小变化外,模板的工作方式大致相同。

Weppy与其他框架形成鲜明对比,包括它们仅作为插件或附加组件包含的一些功能。例如,Flask和Bottle都没有内置的ORM或数据管理系统。Weppy包含一个ORM,虽然它是基于pyDAL项目而不是更受欢迎的SQLAlchemy。Weppy甚至支持模式迁移,Django支持模式迁移作为其ORM的一部分(同样,Django的迁移系统也更加自动化)。虽然Weppy有一个扩展机制,但官方批准的附加组件列表很小,远小于Flask的扩展目录。

像Weppy这样的轻量级框架通常用于构建RESTful API,而Weppy则为此配备了便利功能。在路由上放置一个@service修饰器,返回的数据将自动格式化为选择的JSON或XML。

Weppy包含的其他功能更符合更大的框架,但它们是在没有批量的情况下实现的。示例:数据验证机制,表单处理,响应缓存和用户验证。在所有这些情况下,Weppy采取“恰到好处”的方法。提供的功能并不像在Django大小的框架中那样完整,但开发人员不需要投入大量精力来使它们变得有用,并且它们可以在事后得到扩展。

Weppy中发现的另一个通常与更重量级框架相关的功能是国际化支持。模板中的字符串可以根据应用程序提供的区域设置文件进行翻译,这些文件是简单的Python字典。也可以通过解析浏览器请求(即Accept-Language HTTP标头)或将翻译绑定到特定路由来设置语言选择。

Weppy的文档与框架本身具有相同的风格。它干净,可读,并且被人类消费。除了通常的“hello world”应用程序示例之外,它还包含一个很好的演练教程,可以让你创建一个微博系统作为初学者项目。

Weppy的长期计划包括支持异步和套接字作为低级一流实体。 Weppy的开发人员计划在2.0版本中引入这些功能,然后要求所有未来版本的Weppy使用Python 3.7或更高版本。

Zope2

Zope不适用于简单的RESTful API(每Bottle或Flask),甚至不适用于具有交互性的基本网站(à la Django)。相反,它意味着是一个完整的企业级应用程序服务器堆栈,类似于Java产品。该文档将该框架描述为“对组件开发人员,整合者和Web设计人员最有用。”一个主要的第三方产品Plone CMS使用Zope作为其基础,并作为Zope持续开发的主要驱动力。

Zope通过从Web获取请求,将请求的参数与内部对象数据库(ZODB)匹配,并使用请求的GET或POST参数执行该对象来工作。无论从对象返回什么,都会返回给客户端。 Zope使用此数据库对象系统来简化任务,例如分配粒度对象权限,为对象提供继承层次结构,以及处理数据库对象的事务和回滚。

由于Zope的尺寸和复杂性,安装需要一些工作;这不是简单地将源解压缩到项目子文件夹中的问题。一些设置过程包括编译C模块,因此在Windows上安装很棘手。自2010年以来,Zope的预打包Windows二进制文件尚未更新,并且围绕它们的文档状态使得很难确定设置的最佳实践。但是,实际框架的文档非常好。 Zope2 Book是一本非常详细的纲要。

当启动Zope并连接到服务器时,将看到Web UI,可以在其中创建和编辑ZODB对象。对象采用三种基本角色之一:内容,逻辑和表示,并且可以包含文档(基本上,任何具有MIME类型的文件),Python脚本和HTML模板。

模板可以是两种类型之一:新的和更灵活的Zope页面模板(ZPT)系统,或旧的和更基本的DTML标记系统。ZPT使用HTML标记中的属性来指示数据的放置位置,从而可以更轻松地使用传统的HTML工具设计模板。但是ZPT语法需要一些时间来习惯。

Zope声称其面向对象方法的优点之一是系统中的每个操作,无论它作用于何种对象,都由事务封装。因此,如果删除存储在Zope数据库中的文件或对一段代码进行破坏性更改,则只需回滚执行它的操作。缺点是很难在这样的代码库上使用像Git这样的现代源代码控制工具,这意味着你将数据放在Zope的自定义数据库工具的支配下。请注意,可以将MySQL之类的外部数据库连接到Zope应用程序,但这主要用于托管应用程序数据,而不是替换ZODB。

与这里讨论的许多较小的,更灵活的框架相比,Zope的遗留和大小转化为许多缺点。最大的缺点是Zope只能在Python 2.x下运行,所以不能利用Python 3库或异步语法,尽管正在努力解决这个问题。 (Zope 4仍处于测试阶段,包括Python 3支持以及更多支持。)

轻量级的Python Web框架

Bottle

Bottle可以被认为是一种迷你烧瓶,因为它比其他“微框架”更加紧凑和简洁。由于其占地面积最小,Bottle非常适合包含在其他项目中或快速交付REST API等小型项目。

Bottle的整个代码库适合单个文件,并且绝对没有外部依赖性。即便如此,Bottle还配备了足够的功能来构建常见的Web应用程序,而无需依赖外部帮助。

Bottle中的路由系统将URL映射到函数,其语法与Flask几乎完全相同。也不仅限于硬连线路径;可以动态创建它们。可以通过Bottle框架中的对象访问和操作请求和响应数据,cookie,查询变量,来自POST操作的表单数据,HTTP标头和文件上载。

每项功能都经过精心细致的实施。例如,使用文件上载,如果文件的命名约定与目标文件系统冲突(例如Windows上的名称中的斜杠),则不必重命名该文件;瓶子可以帮到你。

Bottle包含自己的简单HTML模板引擎。同样,虽然很小,但它已经装配好了必需品。默认情况下,模板中包含的变量使用安全HTML呈现;你必须指出哪些变量可以安全地从字面上重现。如果更换掉模板引擎并使用另一个模板引擎,例如Jinja2,那么Bottle可以帮助轻松完成。我其实喜欢与Bottle捆绑的简单模板系统;它的语法不起眼,它允许混合代码和模板文本而不会有不适当的困难。

Bottle甚至支持多个服务器后端。它配备了自己的内置miniserver以进行快速测试,但可以支持各种兼容WSGI的HTTP服务器,并在需要时可以回退到普通的旧CGI。

Bottle不需要像其他框架那样多的文档,但文档绝不是吝啬。所有关键的东西都适合单个(尽管很长)的网页。除此之外,还可以找到每个API的完整文档,如何在各种基础架构上进行部署的示例,内置模板语言的解释以及一系列常见配方。

与Flask一样,可以手动或通过编写补充瓶的插件扩展Bottle的功能。 Bottle插件列表远不及Flask的大小,但有一些有用的部分,例如与各种数据库层的集成和基本的用户身份验证。对于异步支持,Bottle可以使用异步运行的现有服务器适配器之一,例如aiohttp/uvloop。

Bottle极简主义的一个后果是有些功能根本就不存在。不支持表单验证,包括CSRF保护等功能。如果要构建支持高度用户交互的Web应用程序,则需要自己添加它们。

CherryPy

CherryPy已经存在了超过10年,但并没有失去最初区分它的极简主义和优雅。

这个框架的前提是,除了只包含为web页面提供服务所需的少量内容外,它应该尽可能地让人感觉它不像“web框架”,而是像任何其他类型的Python应用程序一样。根据文件显示,Hulu和Netflix等网站在制作中使用了CherryPy,这可能是因为该框架提供了一个高度低调的基础。

CherryPy可以将Web应用程序与核心逻辑区分开来。要将应用程序的功能映射到CherryPy提供的URL或路由,需要创建一个类,其中对象的名称空间直接映射到您要提供的URL;例如,网站的根由名为“index”的函数提供。传递给这些函数的参数用于处理由GET或POST方法提供的变量。

CherryPy包含的位用作低级构建块。包括会话标识符和cookie处理,但不包括HTML模板。像Bottle一样,CherryPy提供了一种将路由映射到磁盘上的目录以供静态文件服务的方法。

建议通过WTForms库进行扩展。通过第三方扩展程序提供。

CherryPy通常会遵循现有的第三方库来支持某个功能,而不是尝试本机提供它。 例如,CherryPy不直接支持WebSocket应用程序,而是通过ws4py库支持。

CherryPy的文档包含一个方便的教程,介绍了该程序的各个方面。与其他框架教程不同,它不会引导完成一个完整的端到端应用程序,但它仍然有用。这些文档提供了有关各种场景中部署的方便说明,包括虚拟主机,通过Apache和Nginx的反向代理以及许多其他方案。

CherryPy在引擎下使用池化线程,更好地支持多线程服务器适配器。如果想尝试其他方法,CherryPy的非官方第三方分支交换asyncio协程而不是线程。

Falcon

如果正在构建基于REST的API而不是其他任何东西,那么Falcon提供的绝对必要。它的设计精简而快速,几乎没有标准库之外的依赖关系。

Falcon获得“轻薄”标签的原因很大一部分与框架中的代码行数无关。这是因为Falcon在应用程序上几乎没有任何结构。Falcon应用程序所要做的就是指出哪些函数映射到哪些API端点。从给定端点返回JSON只需设置路由并通过Python标准库中的json.dumps函数从中返回数据。对Python 3的async的支持尚未落入Falcon,但正在努力实现这一目标。

Falcon还采用了理智的开箱即用默认设置,因此安装时几乎不需要修改。例如,对于未明确声明的任何路由,默认情况下会引发404。如果要将错误返回给客户端,可以引发与框架捆绑在一起的许多库存异常中的一个(例如HTTPBadRequest)或使用泛型falcon.HTTPError异常。如果需要为给定路线进行预处理或后处理,Falcon也会为这些路径提供挂钩。

Falcon对API的关注意味着用传统的HTML用户界面构建Web应用程序几乎没有。例如,表单处理功能和CSRF保护工具几乎不存在。也就是说,Falcon提供了优雅的选项来扩展其功能,因此可以构建更复杂的项目。除了上面提到的挂钩机制之外,还可以找到一个用于创建中间件的界面,该界面可用于包装所有Falcon的API。

Falcon的文档与其他框架相比比较细长,但仅仅因为它的覆盖范围较小。用户指南包括所有主要功能的正式逐步演练,以及一个快速入门部分,可让您查看带或不带注释的示例代码。

Flask

关于Python中的Web框架的大多数讨论都是从Flask开始提到的,并且有充分的理由。 Flask是一个成熟的,易于理解的框架,广泛使用且非常稳定。使用Flask进行轻量级Web项目或基本REST API几乎不可能出错,但如果试图构建更大的东西,将面临繁重的工作。

Flask的核心吸引力在于其进入门槛低。一个基本的“hello world”Flask应用程序可以在少于10行的Python中设置。广泛使用的HTML模板系统Jinja2附带了使渲染文本变得容易的框架,但是Jinja2可以换成任何数量的其他模板引擎(例如Mustache),或者可以自己动手。

简洁的名称,Flask默认省略了许多细节。例如,它没有开箱即用的数据层或ORM,也没有类似表单验证的规定。但是,它可以通过扩展进行扩展,其中有几十个,包括许多常见用例,如缓存,表单处理和验证,数据库连接等。这种默认设计允许开始设计具有绝对最小功能的Flask应用程序,然后仅在需要时将所需的部分分层。

Flask的文档和蔼可亲,易于阅读。快速入门文档非常出色地帮助启动和运行,同时还解释了为简单的Flask应用程序所做的默认选择的重要性,并且API文档充满了如何使用所有内容的良好示例。同样优秀的是“片段”的集合,这些片段是如何使用Flask完成特定任务的快速和肮脏的示例,例如如果存在如何返回对象,如果不存在则返回404错误。

Flask在2018年早些时候发布了它的里程碑1.0版本,Python 2.6和Python 3.3是支持的最低版本,并且它的许多行为最终都是一成不变的。Flask没有明确支持Python的异步语法,但是为了满足这种需求,已经剥离了一个名为Quart的与Flask相关的API兼容变体。

Pyramid

小而轻,Pyramid比Django更接近Flask甚至Falcon。因此,它非常适合于将现有Python代码公开为REST API,或者为开发人员完成大部分繁重任务的Web项目提供核心的任务。

描述Pyramid极简主义的一个好方法是“无策略”,这是在文档部分中使用的一个术语,用于讨论Pyramid如何与其他Web框架形成对比。你使用什么样的数据库或什么样的模板语言不是金字塔的关注点。

“Pyramid仅提供一种机制来映射URL以查看代码,”文档说,“以及一组用于调用这些视图的约定。可以自由地在您的应用程序中使用符合您需求的第三方组件。“

构建基本的Pyramid应用程序只需要很少的工作。与Bottle和Flask一样,Pyramid应用程序可以包含单个Python文件,除了框架本身的文件。一个简单的单路径API不需要十几行代码。其中大部分是来自... import语句和设置WSGI服务器的样板。

默认情况下,Pyramid包含Web应用程序中常见的几个项目,但它们是作为要拼接在一起的组件提供的,而不是完整的解决方案。例如,包括对用户会话的支持,它甚至还带有CSRF保护。但是对Django提供的用户帐户(例如登录或帐户管理)的支持不是交易的一部分。您必须自己滚动或通过插件添加它。表单处理和数据库连接也是如此。

Pyramid避免过于极小的一种方法是通过提供从Pyramid项目制作模板的方法来重用或重新使用先前的工作。这些模板,即Scaffolds,生成一个带有简单路由和一些入门HTML / CSS模板的Pyramid应用程序。默认情况下,Pyramid包含的支架包括一个示例启动项目和一个通过常用的Python库SQLAlchemy连接到数据库的项目。

Pyramid在测试和调试工具方面同样细长。在Pyramid应用程序中捆绑debugtoolbar扩展,将在应用程序生成的每个网页上获得一个可点击图标,该图标生成有关应用程序执行的详细信息,包括发生错误时的详细回溯。还存在记录和单元测试,即使从这个轻量级的框架中排除两个看起来也很愚蠢的项目。

Pyramid的文档很棒。除了快速浏览基础知识和教程式演练之外,还可以找到一组社区贡献的教程,用于构建各种项目和常用食谱的烹饪手册。后者包括针对大量目标环境的部署技术,从Google App Engine到Nginx。

Pyramid支持Python 2和Python 3,但不使用Python 3的异步语法。有关如何在Pyramid中利用异步的线索,请参阅aiopyramid项目,其中包括用于异步驱动的“hello world”应用程序的脚手架。

Tornado

Tornado是针对特定用例的另一个小框架。Tornado专为构建异步网络应用程序而设计,非常适合创建同时打开大量网络连接并使其保持活动状态的服务,即涉及WebSockets或长轮询的任何内容。

像Bottle或Falcon一样,Tornado省略了与其核心目的无关的特征。例如,Tornado有一个内置的模板系统,用于生成输出(以HTML或其他方式)和国际化,表单处理,cookie设置,用户身份验证和CSRF保护的机制。但是它省略了类似于表单验证和ORM的功能,它们更适合面向用户的Web应用程序。

Tornado擅长为需要严密控制异步网络细节的应用程序提供基础架构。例如,Tornado不仅提供内置的异步HTTP服务器,还提供异步HTTP客户端。因此,Tornado非常适合构建应用程序,例如Web scraper或bot,它们并行查询其他站点并对返回的数据进行操作。

如果正在尝试创建一个使用HTTP以外的协议的应用程序,Tornado会提供帮助。它提供对DNS解析器以及第三方认证服务等实用程序的低级TCP连接和套接字的访问,并支持通过WSGI标准与其他框架进行互操作。文档很小但不稀疏,包含了如何完成所有这些的大量示例。

Tornado既利用并补充了Python的异步行为本机功能。如果使用的是Python 3.5,Tornado支持内置的异步和等待关键字,它们可以为应用程序提供速度提升。对于早期版本的Python,可以使用yield语句。在任何一种情况下,都可以使用期货或回调来处理对事件的响应。

Tornado 5.0改进了与Python的本机异步功能的集成。因此不再支持Python 3.3,并且Python 3.5用户必须使用Python 3.5.2或更高版本。 Tornado 6.0将需要Python 3.5及更高版本,并将完全放弃Python 2支持。

文档描述为“类BSD”.由同一作者通过单独的库提供。支持SQLAlchemy作为标准ORM但不包括在内。Tornado wiki中提供的链接。可通过第三方扩展程序获得。

Tornado还提供了一个同步原语库,信号量,锁等,以协调异步协程之间的事件。请注意,与Python解释器本身一样,Tornado通常运行单线程,因此这些原语与其线程名称不同。 但是,如果想在并行进程中运行Tornado以利用多个套接字和内核,那么可以使用这些工具。

Tornado的文档涵盖了框架中的每个主要概念以及模型中的所有主要API。 虽然它包含一个示例应用程序(网络抓取工具),但它主要用于演示Tornado的排队模块。

Web.py

Web.py最初是由已故的Aaron Swartz创建的,并被用作Reddit的原始基础。尽管Reddit可能已经从Web.py转移,但Web.py继续由其他人维护,主要是Anand Chitipothu。在范围和设计上,Web.py类似于Bottle和Flask;你可以把它当作一个基本的骨架,然后在它上面构建,而不会感觉太受限制。

要调用基本的Web.py实例,需要做的就是传递一个URL和函数映射列表。 URL可以包含带有捕获参数的正则表达式,允许使用/users/RayB或/article/451等格式从URL中提取数据。 Bottle具有类似的机制,但也提供了确保参数符合某些标准的方法(例如,它们只能是整数)。

Web.py在很大程度上保持干净和朴素,因为它不会尝试承担其他机制更好处理的任务。例如,没有本机功能允许从Web.py堆栈提供静态内容;说明明智地建议改为通过Web服务器。相比之下,Bottle具有提供静态内容的本机功能,尽管它是可选的。 Web.py还包括cookie和会话管理,甚至还有一个简单的输出缓存。

Web.py有一个HTML模板系统;它是非常基本的,但允许if/then/else逻辑。更复杂,更有用的是Web.py的动态生成HTML表单的系统,具有CSS样式的类属性和基本的表单验证机制。如果希望使用以编程方式生成的表单(例如基本数据库资源管理器)生成应用程序,这将非常方便。

Web.py的文档与框架本身一样小,但它并没有提供相关的示例。 “cookbook”部分(多种语言,不低于)演示了许多常见用例(提供静态内容,逐步传输大型文件等)。甚至还有一个使用该框架构建的真实Web应用程序库,其中许多都带有源代码。

请注意,Web.py并未像其他框架一样保持与Python 3兼容性的最新状态。这不仅意味着缺乏对异步语法的支持,还意味着缺少对已弃用的函数的错误。此外,目前尚不清楚维护者是否有计划在Python 2到达其支持生命周期结束后保持Web.py的最新状态。

Wheezy.web

Wheezy.web是Web框架的Flask/Bottle/Pyramid模型:小巧轻便,专注于提供高速和高并发性。这个功能集的核心是小的,但它的创建者已经为它配备了各种必备功能。

谈论Wheezy.web作为单一产品有点误导。Wheezy.web将同一作者创建的其他几个库粘合在一起,每个库根据希望应用程序的操作提供不同的服务。例如,Wheezy.http库被Wheezy.web大量用于许多基本行为,但除非应用程序必须执行用户身份验证,否则不需要Wheezy.security库。

这种库集合方法意味着使用Wheezy开发的最简单方法是从PyPI安装它或使用easy_install来收集所有相关的包。我在Python 3.51中使用easy_install时遇到了问题,但它在Python 2.7中运行良好。

Wheezy.web的核心主要是将路由映射到函数和处理重定向,但它配备了一些其他有用的功能。例如,使用@secure装饰器标记的任何路由将仅接受HTTPS请求,并且如果进行HTTP连接尝试将重定向到HTTPS。另一个核心添加是中间件,以便可以自定义路径路由和HTTP错误。

Wheezy的其他库涵盖了一组相当丰富的用例。Wheezy.validation可以帮助确保提交的数据满足特定条件,例如,用户名或密码满足长度或复杂性要求。Wheezy.caching允许缓存未更改的响应以加速处理,Wheezy.captcha与Python的PIL/Pillow图像库集成以生成验证码。对于国际化,它与标准GNU gettext实用程序集成。

核心Wheezy.web框架不包含模板引擎。如果需要做的不仅仅是返回纯文本或JSON,可以添加Wheezy.template引擎或连接许多第三方引擎,如Jinja2和Mako。 Wheezy.web也省略了ORM; Wheezy文档中的示例通过手动SQL字符串使用SQLite。

使用Wheezy构建应用程序需要比使用Flask或Bottle更多的样板,但不要过分;其中大部分涉及设置路线和中间件,这些东西可以在不费力的情况下抽象出来。Wheezy的文档中详细解释了这些细节,其中包括“创建留言簿”教程,但其他方面则是关于奖金的。

Wheezy的开发似乎已经停滞不前,因为该项目的最后一次提交都记录在2015年。这对于保持与新Python功能的兼容性并不是好兆头。

权衡Python Web框架选项

选择Python Web框架与选择任何其他软件工具没什么不同:它完全是为了适应目标和适应自己的开发习惯和偏好。

如果更喜欢minimal,只需创建一个REST API或在Web框架中包装现有的Python代码,这里描述的许多Python框架都非常适合你的需求。在这方面,Flask和Bottle是很好的选择。由于其紧凑性,Bottle特别适合包含在其他项目中。

Pyramid和CherryPy的项目结构相对较少,因此它们对于快速包装现有代码非常有用。在这方面,Falcon和Tornado更加微弱。它们的开销很小,但也缺乏更强大的Web应用程序所需的更重的工具。 Web.py是涉及用户交互(例如表单提交)的应用程序的快速起点。 Wheezy.web和它的库允许按照自己想要的功能去做。

对于具有更高端需求的开发人员而言,Django是最好的起点之一,不仅因为其拥有丰富的开箱即用组件,而且庞大的用户社区多年来取得了巨大成功。如果你不需要这样的完整性,Weppy是一个很好的折衷方案,因为它比更小的框架具有更多扩展的功能集。

最后,虽然CubicWeb和Zope2仅提供整个开发环境而不是框架,但它们都是头重脚轻和特殊的。使用它们是以学习它们的特性为代价的。

原文链接:

https://www.infoworld.com/article/3105502/python/review-13-python-web-frameworks-compared.html

Python的gevent带来的非阻塞IO和coroutine同步方式封装异步,足以完爆Twisted;
Nodejs的特性也就是非阻塞IO和更快语言解释器,但是基于事件编程模式更合适对用户响应方式的前端,不太合适大部分是RPC或循环方式的服务端逻辑;
现在分布式和SMP架构下 gevent多进程+coroutine+简洁的语言特性+容易C/C++性能扩展绝对是理想选择。
tornado的coroutine跟greenlet略有区别,跟asyncio里的协程类似。本质上来说只是把本来需要拆成多个callback的代码合进了一个生成器,生成器不断yield一系列的Future对象,调度器在Future完成时通过调用生成器的send方法唤醒协程,实现执行-等待-执行-等待的逻辑,而从全局看,所有协程共享一个线程,一个协程等待的时候调度器会插入其他协程进行执行。通过gen修饰的协程本身也会返回一个Future,这个Future在协程返回时完成,等待这个Future就可以达到等待协程执行结束的效果。

Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架的相关教程结束。

《Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架.doc》

下载本文的Word格式文档,以方便收藏与打印。