Python框架虽然说是百花齐放,但仍然有那么一家是最大的,它就是Django。要说Django是Python框架里最好的,有人同意也有人 坚决反对,但说Django的文档最完善、市场占有率最高、招聘职位最多估计大家都没什么意见。Django为人所称道的地方主要有:
完美的文档,Django的成功,我觉得很大一部分原因要归功于Django近乎完美的官方文档(包括Django book)。
全套的解决方案,Django象Rails一样,提供全套的解决方案(full-stack framework + batteries included),基本要什么有什么(比如:cache、session、feed、orm、geo、auth),而且全部Django自己造,开发网 站应手的工具Django基本都给你做好了,因此开发效率是不用说的,出了问题也算好找,不在你的代码里就在Django的源码里。
强大的URL路由配置,Django让你可以设计出非常优雅的URL,在Django里你基本可以跟丑陋的GET参数说拜拜。
自助管理后台,admin interface是Django里比较吸引眼球的一项contrib,让你几乎不用写一行代码就拥有一个完整的后台管理界面。
而Django的缺点主要源自Django坚持自己造所有的*,整个系统相对封闭,Django最为人诟病的地方有:
系统紧耦合,如果你觉得Django内置的某项功能不是很好,想用喜欢的第三方库来代替是很难的,比如下面将要说的ORM、Template。要在Django里用SQLAlchemy或Mako几乎是不可能,即使打了一些补丁用上了也会让你觉得非常非常别扭。
Django自带的ORM远不如SQLAlchemy强大,除了在Django这一亩三分地,SQLAlchemy是Python世界里事实上的ORM标准,其它框架都支持SQLAlchemy了,唯独Django仍然坚持自己的那一套。Django的开发人员对SQLAlchemy的支持也是有 过讨论和尝试的,不过最终还是放弃了,估计是代价太高且跟Django其它的模块很难合到一块。
Template功能比较弱,不能插入Python代码,要写复杂一点的逻辑需要另外用Python实现Tag或Filter。关于模板这一点,一直以来争论比较多,最近有两篇关于Python模板的比较有意思的文章可供参考:
URL配置虽然强大,但全部要手写,这一点跟Rails的Convention over configuration的理念完全相左,高手和初识Django的人配出来的URL会有很大差异。
让人纠结的auth模块,Django的auth跟其它模块结合紧密,功能也挺强的,就是做的有点过了,用户的数据库schema都给你定好了,这样问题就来了,比如很多网站要求email地址唯一,可schema里这个字段的值不是唯一的,纠结是必须的了。
Python文件做配置文件,而不是更常见的ini、xml或yaml等形式。这本身不是什么问题,可是因为理论上来说settings的值是能够动态的改变的(虽然大家不会这么干),但这不是最佳实践的体现。
总的来说,Django大包大揽,用它来快速开发一些Web运用是很不错的。如果你顺着Django的设计哲学来,你会觉得Django很好用,越用越顺手;相反,你如果不能融入或接受Django的设计哲学,你用Django一定会很痛苦,趁早放弃的好。所以说在有些人眼里Django无异于仙丹, 但对有一些人来说它又是毒药且剧毒。
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兼容变体。
Bottle
瓶子是一个微框架。Bottle最初意味着构建API,它将所有内容都实现在一个源文件中。除了Python标准库之外,它没有任何依赖关系。使用Bottle进行编码可以让您更接近金属而不是使用任何全栈框架进行编码。
其默认功能包括路由,模板,实用程序以及WSGI标准的基本抽象。
路由 - 支持对函数调用映射的请求,使您可以实现干净和动态的URL
模板 - 快速和Pythonic 开箱即用,全面支持mako,jinja2和猎豹
实用程序 - 舒适地访问表单数据,文件上传,Cookie,标题和其他与HTTP相关的元数据
服务器-支持一个内置的HTTP开发服务器fapws3,比约恩,GAE,СherryPy,以及任何其他WSGI能力的HTTP服务器
Bottle是原型开发,学习Web框架组织以及构建简单个人应用的完美解决方案。
CherryPy
CherryPy是一个开源,极简主义的Web框架。它使构建Python Web应用程序与构建任何其他面向对象的程序无异。
事实上,CherryPy支持的网络应用程序是一个独立的Python应用程序,它嵌入了自己的多线程网络服务器。CherryPy应用程序可在任何支持Python的操作系统上运行(Windows,MacOS,Linux等)。它们可以部署在任何可以运行普通Python应用程序的地方。CherryPy应用程序不需要Apache,但是您可以在Apache后面运行CherryPy应用程序,以及在Lighttpd或IIS后面运行它。
CherryPy不是一个非常有限的框架,因为它允许您使用任何类型的技术进行模板化,数据访问等。但是,它仍然能够处理会话,静态,Cookie,文件上传以及web框架通常可以执行的其他任何操作。
一些默认的CherryPy功能包括:
一个HTTP / 1.1兼容WSGI线程池网络服务器
简单一次运行多个HTTP服务器
一个强大的配置系统
一个灵活的插件系统
出的现成的工具缓存,编码,会话,认证,静态内容,并等
内置支持分析,覆盖和测试
能够在Python 2.7+,Python 3.1+,PyPy,Jython和Android上运行
异步框架
Sanic
Sanic是一个构建在uvloop上的Python Web框架,专门为通过异步请求处理的快速HTTP响应而创建。
它运行在Python 3.5+上。Sanic支持异步请求处理程序,这使它与Python 3.5的异步/等待函数兼容。这提高了速度,提供了非阻塞功能。
在一个进程和100个连接的基准测试中,Sanic每秒能够处理33,342个请求。
Tornado
Tornado是一个Python Web框架和异步网络库。它使用非阻塞网络I / O并解决C10k问题(意思是说,如果配置正确,它可以处理10,000多个并发连接)。
这使它成为构建需要高性能和数万并发用户的应用程序的理想工具。
龙卷风的主要特点是:
内置的用户认证支持
实时服务
高品质的性能
基于Python的网页模板语言
非阻塞HTTP客户端
实施第三方认证和授权计划(Google OpenID / OAuth,Facebook登录,雅虎BBAuth,FriendFeed OpenID / OAuth,)
支持翻译和本土化
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”应用程序的脚手架。