我们知道Web开发最重要的是选择合适的框架,一个好的框架可以极大的提高我们开发的效率,也能帮助我们的应用能按照需求快速迭代。Web框架的数量和质量是一个语言是否成熟的标志之一。PHP下有Larvarel、CodeIgniter,Yii、TP等著名框架使得PHP成为最流行的Web语言之一。Ruby借助其强大框架Rails以RoR(Ruby on Rails)生态开辟了一番天地,很多RoR应用以强大的功能和敏捷能力而闻名,比如知名Git服务器系统Gitlab。那么时下最流行的语言Python Web框架的情况怎么样呢?今天虫虫就来给大家介绍这个。
概述Python和PHP一样,也有着大量的Web框架,其Web框架生态圈非常广泛和多样化。在进入具体主题之前,我们先介绍下Web框架。
Web框架是对常见通用功能的打包,比如Web权限认证模块、导航路由模块、HTTP解析模块、ORM模块以及做扩展使用的插件体系等,打包这些功能可以让开发人员轻松地创建Web应用程序。是一种高层次的代码和应用逻辑重用方法,可以极大的它减少了开发人员花在编写代码上的时间从而提高开发效率。通过提供现成的解决方案,Web应用程序框架可以帮助开发人员短时间内完成应用的开发并持续的迭代。
Django说到Python的Web框架,无疑最想到的必然是Django。Django和Laravel最初都是借鉴了RoR的强大思想(动态、DDD、约定优于配置、低重复、及时反馈)。Django框架使用了类MVC的MVT(模型、视图、模板)模式,用Django ORM和数据库联系。
Django ORM内置的管理面板,可以轻松实现数据库内容的管理。使用很少的配置就可能,自动生成数据库模型。
视图可以包括函数和类,视图的URL路由分配在urls.py文件中完成,可以设计出完美优雅的URL调度。
Django的模板的系统则相当简单,甚至不支持直接嵌入代码,需要预先生成Tag、Filter才能调用。
Django支持强大的解决方案:
全栈模式,内置了大量所有必须的模块cache、session、feed、orm、geo、auth。
同时也支持"内置电池"(batteries included)模式。
Django是典型的"大而全"的逻辑,这可以极大的方便大多数开发者。但是这就导致其灵活性不足。要引入其他更好的第三方优秀组件就基本上很难,比如想要在Django里用SQLAlchemy或Mako,需要打上很多补丁,而且会导致管理面板,授权,会话处理或生成表单等功能都不能使用。
当然Django最人性化的地方是其强大的社区支持和详细文档完美的文档Django 书。文档在安装后就完全嵌入系统的各个部分,使用非常方便,这使得其开发的入门门槛很低。
最后给一个Django网站模型的示例:
PyramidPyramid也是一个常用的热门Python Web框架,它源于Pylons和repoze.bfg模块,在吸取精华的基础上使得Pyramid快速成长为了一个成熟和稳定的框架。
虽然两者出现的时间差不多(2005),Pyramid和Django的设计思想则大相径庭。Pyramid非常灵活,很容易定制,可以非常自我的方式以创建特征。Pyramid不会强迫使用框架的习语,对于复杂或高度非标准的项目来说,这点非常有用。
虽然也内置ORM模块,但是更倡导使用成熟的SQLAlchemy ORM。你也可以按照喜好来定制,比如你可能喜欢peewee ORM,使用原始SQL查询或与NoSQL数据库集成。
Pyramid中所有选项都是开放式的,所以需要动手能力强一点,可能最初学者稍有点门槛。
Pyramid是一个自称"开始小,完成大,保持完备的框架。"(start small, finish big, stay finished framework.)。所以非常适合有一定经验丰富的开发人员。
Pyramid一个典型的"Hello Chongchong"应用示例:
web2pyweb2py源于一个教学范例框架,其最关心的是是易于开发和部署。
Web2py框架也源于RoR和Django思想的启发,奉行约定优于配置的想法,web2py中有很多合理的默认值,允许开发人员快速启动。
Web2py框架自带了很多模块,比如内置服务器,生成HTML的帮助器,表单,验证器等等,但是Web2py多数据库引擎的支持很简单。其他更多内置的功能有:
jQuery和Ajax建站助手;
调度程序和cron;
双因子认证助手;
文本消息发送器;
事件工单系统,允许自动将生产环境中发生的问题分配给开发人员。
Web2py也宣称,提供全栈式解决方案,提供可能需要的一切模块。
Web2py在线提供了大量文档:
从零开始逐步指导入门,比如简要介绍Python语言。以友好的方式展示web2py的各个功能,包括大量代码示例和屏幕截图等。
尽管具有一定竞争优势,但web2py的社区远远小于Django和Pyramid。其官方邮件列表也不大活跃。另外web2py目前还不能和Python 3不兼容。
web2py一个典型的广告模型示例:
微框架与大而全思想相反的设计思想是,小而精致的设计,这就是微框架。微框架的好处就是没有冗余,因而性能都很好。
FlaskFlask是除了Django外最流行的Python Web框架。Flask是一个微框架,具备了基本功能,也支持轻松的扩展。因此,Flask更适合做为胶水来用,来粘合各个Web库。
纯 Flask不支持任何存储,但是可以Flask-SQLAlchemy,Flask-MongoAlchemy和Flask-Redis等。类似的基本模板系统是Jinja2,可以使用Mako替换。
Flask框架的座右铭是轻量,"一次一滴"(one drop at a time),这也在其文档中得到全面反映。关于如何构建Flash应用程序可以通过点点滴滴方式学习。阅读几段文档后,就能适应其开发任务了。
在Flash中你不需要一次就学习很多东西,尤其高级的功能,知道你真正需要的时候再学不迟,这样可以避免无实践的"尴学"。
Flask的最大问题是,没有大量Flask扩展支持和功能打包。常常遇到扩展插件停更或者文档过时的情况,需要花费大量的精力处理这些情况。
Flask一个简单示例如下:
FalconFalcon 猎鹰也是一个比较流行的微框架。其目标是创建一个简洁、轻量地Web应用程序基础。官方宣称Falcon是一个裸壳(bare-metal),无限膨胀(bloat-free)的工具集,用于快速的构建后端代码和微服务。Falcon兼容Python 2和3,不用担心Python的版本问题。
Falcon的一大优势在于其性能非常高,非常快。其官方网站基准测试显示,其比Django或Flask等具有很高的性能优势(27~75倍)。
Falcon缺点是其打包模块有点太少,有路由,中间件,钩子,除此之外就不提供其他功能了(裸壳)。额外其他功能,比如验证等都需要开发人员来开发扩展。因为其设计中就假设用于构建REST API。
当然其高性能的高度定制的特点确实是一个很好的卖点。毕竟有时候"最简单的解决方案就是最好的方案"。
Falcon示例程序:
API StarAPI Star是一个新的Web微框架,只支持Python 3,其特性使用了Python 3.5中引入的类型提示。API Star使用内置的类型提示实现以简洁、声明式的构建验证模式表示,然后绑定这些模式来请求处理函数。
API Star还具有兼容OpenAPI 3 的自动API生成文档功能。
API Star另一个突出的特性是依赖注入机制。这是一个更强大、更智能中间件的替代品。比如可以编写一个所谓的Component,它将使用当前经过身份验证来提供给用户视图。在视图级别,只需要明确声明它将需要User实例,其他事情API Star就会在幕后自动完成。
自动依赖注入优于常规中间件的优点是组件不会有其他未使用视图的开销。同样
API Star也可以以更传统,同步性的,兼容WSGI的方式在asyncio上运行。
最后与API Star捆绑在一起的其他模块都非常标准:比如使用jinja2,路由和事件挂钩进行模板化扩展支持。
总之API Star初生牛犊,发展可观。截止当前其GitHub存储库中有超过5271的星星。贡献者已经接近一百。PR的合并也非常快,是一个快速增长和协作的新兴框架。
基于异步和asyncio的框架Python web网站通常很慢,为了提高性能,异步技术就成了灵丹妙药。Python也有很多这类的框架。
TwistedTwisted是Python中最古老,最成熟的Python异步框架。Twisted最初产生于2002年,其核心是一个名为reactor的事件驱动网络引擎,用于调度和调用用户定义的回调。开始的时候开发人员必须通过定义函数并在操作成功和失败时分别传递它们来使用显式回调。
后来Twisted引入了inlineCallbacks ,用于编写异步代码程序,这些代码与常规同步代码一样简单易读。这个解决方案非常适合Python的语法,并且极大地影响了标准库asyncio中的现代异步工具包。
Twisted框架的最大优点是虽然本身只是一个捆绑很少的引擎,但支持许多其他扩展可用于扩展其功能,比如从低级网络编程(TCP/UDP)和高级应用程序(HTTP,IMAP,SHH等)。所以,Twisted天然适合编写专业服务,但不适合常规Web应用程序。开发人员必须自己编写很多东西才能实现Django中自带那些功能。Twisted目前开发和维护还很活跃,正在努力迁移代码到Python 3,其核心功能不久前被重写,但许多第三方模块还存在兼容性问题。
Twisted inlineCallbacks代码示例:
SanicSanic是基于asyncio-Python的异步编程工具箱,与Python 3.4版本的标准库捆绑在一起。Sanic的开发基于Sanic需要掌握asyncio思想,涉及协程的理论知识,并发编程以及关于应用程序中数据流的推理。Sanic在处理长连接时特别有用,比如websocket,如果需要支持websockets或进行大量持久的外部API调用,Sanic是个非常不错的选择。
Sanic的另一个用例是编写 "glue-web App",它可以作为两个具有不兼容API的子系统之间的代理。
Sanic框架非常快。其中一个依赖项是Uvloop,它用来替换asyncio的内置事件循环的替代品。 Uvloop是libuv的包装器,与Node.js相同的引擎。根据uvloop官方文档,可以让 asyncio的效率提高了2-4倍。
就功能方面Sanic模仿Flask,比如通过共享Blueprints的概念,微小的子应用程序,允许开发人员在更大的应用程序中拆分和组织其代码。对于光光是数据增删改查CRUD应用,Sanic也不是一个好的选择。
Sanic的一个示例:
Japronto在高性能编程领域,有著名的C10K甚至C10M问题,Python Web应用怎么实现每秒处理100W的请求呢?这就是Python把asyncio添加到标准库时想要实现的目标。Japronto是一个基于asyncio的微框架。通过使用uvloop和PicoHTTPParser Japronto实现了每秒处理100万个请求。 Uvloop上面说了是基于libuv的asyncio后端,而PicoHTTPParser是用C编写的轻量级HTTP头解析器。
Japronto框架的所有核心组件也用C实现,还使用各种低层优化和技巧来调整性能。Japronto主要用于高性能特殊任务,它们无法通过大而冗余的主流框架实现。
Japronto还为REST API的微服务开发提供坚实的基础,开发人员只需要设置路由并确定哪些路由应使用同步或异步处理程序。
Japronto中"Hello world"应用示例:
aiohttpAiohttp是另一个基于asyncio的库,与其说aiohtt是个Web框架,其更像是一个工具箱,补充了与HTTP相关的异步库。aiohttp不仅有助于编写服务应用程序,还有助于客户端的开发。两者都受益于asyncio,最重要的是能够同时处理数千个连接。
客户端开发方面,当需要同时发出大量请求时,使用异步的的客户端脚本非常有用。比如写一个爬虫抓取网页。如果没有asyncio,就要使用线程或多进程,这样更加不好处理,而且需要的资源更大。
除了构建独立应用程序之外,aiohttp的客户端也可以用于任何需要非阻塞HTTP调用。也支持Websockets,通过,aiohttp可以轻松地连接到websocket服务器进行消息交换。
在服务器端aiohttp提供了微框架所能提供的一切,包括路由,中间件和信号机制等开箱即用的功能。麻雀虽小五脏俱全,aiohttp可以满足Web服务器的需求。
Aiohttp是在考虑测试的基础上构建的。想要测试基于aiohttp的应用程序的开发人员会发现它非常容易,特别是和pytest配合使用的情况下。
aiohttp默认就可以提供很好的性能,但还可以自主优化,比如配合其他库使用,比如cchardet和aiodns。Aiohttp可以自动检测它们;也可以和uvloop配合。
aiohttp的一个明显优势是有活跃的社区和积极地开发维护团队,所以使用aiohttp作为一个开发是个很不错的选择。
aiohttp客户端示例:
其他Web开发框架市面上还有很多的Python Web框架,可能大家也有自己喜欢和使用的,可以回帖共享给大家。
比如Tornado,它是一个Web server,还是一个类web.py的微框架。该框架包括支持异步的库,可以构建支持多个同时连接的应用程序(如长轮询和WebSocket等)。
比如Quixote,可能国内的开发者都比较熟悉。因为国内知名的互动社区豆瓣网就是使用Quixote开发的。
总结本文虫虫给大家分类列举了常用的Python Web框架,可供初学者选择和使用。有一定经验的开发者也可以作为知识开拓眼界来参考。