Djangohtml
Python框架虽说是百花齐放,但仍然有那么一家是最大的,它就是Django。要说Django是Python框架里最好的,有人赞成也有人 坚定反对,但说Django的文档最完善、市场占有率最高、招聘职位最多估计你们都没什么意见。Django为人所称道的地方主要有:web
完美的文档,Django的成功,我以为很大一部分缘由要归功于Django近乎完美的官方文档(包括Django book)。数据库
全套的解决方案,Django象Rails同样,提供全套的解决方案(full-stack framework + batteries included),基本要什么有什么(好比:cache、session、feed、orm、geo、auth),并且所有Django本身造,开发网 站应手的工具Django基本都给你作好了,所以开发效率是不用说的,出了问题也算好找,不在你的代码里就在Django的源码里。django
强大的URL路由配置,Django让你能够设计出很是优雅的URL,在Django里你基本能够跟丑陋的GET参数说拜拜。缓存
自助管理后台,admin interface是Django里比较吸引眼球的一项contrib,让你几乎不用写一行代码就拥有一个完整的后台管理界面。服务器
而Django的缺点主要源自Django坚持本身造全部的轮子,整个系统相对封闭,Django最为人诟病的地方有:网络
系统紧耦合,若是你以为Django内置的某项功能不是很好,想用喜欢的第三方库来代替是很难的,好比下面将要说的ORM、Template。要在Django里用SQLAlchemy或Mako几乎是不可能,即便打了一些补丁用上了也会让你以为很是很是别扭。session
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”应用程序的脚手架。