创建交互式web应用的方法在过去几年发生了天翻地覆的变化。建站的选择似乎是无穷无尽的,并且一旦你开始了解某个框架或者技术栈的优缺点,你很快就会感到困惑。嗯..Django vs Ruby on Rails vs Flask vs Node.js vs Spring vs Yii vs
Batman.js vs <自行脑部流行的框架>.如果你因为Batman的名字而选择它(你牛逼),我表示服。我们Josh.ai的系统需要处理好几种完全不相干的需求,Python让我们可以很灵活的满足这些甚至有时候会相互冲突的需求。
1 Python范儿
首先我想说,我喜欢Python这门语言。在某种意义上说,Python是个万金油——你可以遵循某个有理有据的面向对象编程模式,也可以尝尝某些函数式编程的感觉。我列举一些python语言有趣的特性:生成器,map和filter操作,lambda函数等。有些特性可能看起来很令人费解,但很多时候我会深入到具体的应用场景,研究为了完成某些有趣的任务我到底需要什么。而且,我喜欢python的缩进排版,当然这是个人偏爱。缩进的好处是带来相对干净整洁的代码,这在项目变得很大的时候会非常有用。Pythonic是个时髦话,尽管去打开一个终端,进入python解释器,敲入“import this’来体验吧。
2 你可以拥有全部
如果你正在搜寻配套完善的方案让一个项目尽快落地,可以考虑Django框架。Django以声称“解决web开发的大部分琐碎事务”而闻名。这意味着一旦启动Django应用,大量的功能如数据库处理,HTML模板功能(让页面即时生成内容)开箱即用。许多拥趸也推崇Django自带的管理后台,它本身也是一个Django应用,让用户可以方便的查看、修改和删除数据库中已创建的对象(通过创建数据库model和设定对象如何在dashboard中展示的定制类之间的映射来实现)。除了官方版本的Django,另一大利好是数不清的第三方应用,可以直接引入到自己的项目中。理想情况下这些外部的应用在经过不那么令人头疼的配置之后就可以正常工作了。Django起始于2003年,如今社区已经非常庞大,这意味着通常可以快速搜索到困扰你的问题的答案。相对于其他的选项来说Django是一个很庞大的软件,个人认为需要花费一些时间才能熟练、高效的运用各个组件。如果你对某些开箱即用的方案(包括引入的第三方应用)感到满意,那说明你的项目已经有了很棒的开端。
3 你可以得到足够多
在Pythonweb框架的世界里,颇受欢迎的Flask框架与Django形成了鲜明对比。关于Flask你所知道的第一件事就是它的设计理念之一——Flask是个“微”框架,核心足够轻量级,开发者可以选择用各种方式来扩展功能。如果你的站点提供一系列动态内容供用户浏览,那我推荐你使用Flask框架。我认为创建Flask应用并把它逐步完善的体验是非常轻松愉快、一目了然的(即便与Django相比)。经典的“helloworld”Flask版只需要用户编写7行代码,当然这几行代码也干不了别的事,不过很好的体现了Flask为了提供简洁性所带来的努力。
就扩展性而言,Flask将选择数据库解决方案、模板语言以及其他web应用核心组件的自主权都交由开发者。这让我感觉我对自己的应用从头到脚都尽在掌握。如果你是一个初入门的开发者,不希望自己决定使用什么技术来支撑自己的网站,请记住Flask社区里已经有很多广泛使用的扩展可以让你用相对“标准化”的方式来搞定这些恼人的选项。例如我很推荐Flask专家Miguel Grinberg的这篇tutorial。你将看到只需要忍受一点点痛苦(相比于Flask的其他竞争者来说)就可以组建起一个成熟可用的Flask应用。Flask框架在你从头构建应用的时候可以提供很多便捷,同时不会给你那些你不知道自己是否需要的累赘部件。
4 撬起python的世界
回到语言本身,Python以“只有想不到没有找不到”为几乎所有应用提供库支持而驰名。我觉得python的核心库都提供了完备的文档,这让情况变得不同。一个很好的例子是广泛使用的Numpy和Scipy两个用于科学计算的库。从社区中你可以获取大量用于统计工作的第三方库,例如酷炫的人工智能和机器学习相关的库(访问PyBrain试试看).众所周知作为最广为应用的语言之一,python有一个庞大的社区,这意味着有大量前人的QA,并且往往问题都已经有了漂亮的答案。我把Python看作一个通用型的语言,把它放在你的武器库里,在将来很长一段时间它都能发挥作用。
5 易于部署
某些时候你有一个华丽的web应用想让别人把玩但可能不知该如何操作,幸运的是我有过部署Python应用的愉快体验。我是Heroku的粉丝,因为Heroku可以做很多事情,包括建立虚拟环境,安装Python依赖包,通过把app链接到Github源上让修改代码变得容易,如果你愿意它也可以在不用处理域名、DNS的情况下提供一种访问线上web应用的方法,非常有用的错误日志以及只要你想就可以非常容易的扩展计算资源。Heroku甚至还提供了大量的扩展库用于添加到网站里,例如存储扩展(比如PostgreSQL或者Redis),站点监控,email插件等等。当然除了Heroku还有很多其他替代方案让你的应用跑起来,你可以根据自己对应用控制级别的期望以及价格因素来决定。
6 数据库工作的绝佳选择
前面我间接提到过在使用Flask框架开发时感受到的灵活性。而对于数据库工作来说这一点更明显了。Python有一套完备的库用来处理数据库连接、查询和管理。我近来主要使用PosgreSQL,而即便是对于PostgreSQL也有好几个库可以选择。Psycopg是众所周知的PostgreSQLPython适配库,它提供了一种简洁的方法连接并运行一下基本的查询,适用于建立新部件的时候。如果你喜欢,可以选择另一个方案SQLAlchemy库,它以ORM闻名遐迩。ORM的意思就是你可以创建Python类来模拟需要查询的数据库表,然后就可以通过操作Python里的对象来操作数据库中的数据。如果你想避免手写SQL查询语句,SQLAlchemy也提供了一种Python式的查询方式,这对开发者来说更加自然。数据库是整个应用的基石,所以花一些工夫选择最适合你的站点的方案是值得的。
7 飞速开发
我上面的所有观点都证明了你可以快速搭建起一个可以运行的应用原型,这也是人们对Python的一贯印象。只要有一个类似于Flask的框架,一些用于处理用户授权和数据库连接的扩展以及用Heroku快速启动,你就可以很快看到结果(尤其是考虑到python本身的简洁性)。在你希望尝试新东西并观察效果的时候,这将会是极大的便利。
8 直观的同步机制
Python自带文档完善的同步机制。
当你的站点有许多用户访问并且更改内部信息的时候,你就需要考虑如何保护你的数据,这样谁在什么时间可以访问就变得清楚明白。Python有清晰的语法来给数据结构加锁,设置条件变量以允许更多的事件同时进行等。这些东西可能不会立马用上,但是把它们装在后背燃料箱里面迟早会发挥作用,毕竟没人想被死锁住。
9 异步功能的多样选择
我前面提到了创建大部分人认为的“普通网站”(访问站点里不同的页面,填一些表单,点击某些亮闪闪的按钮等)的一些不错的解决方案。而我们Josh.ai正在开发一款个人助手用来管理智能家庭,这意味着实时通讯在开发中异常重要。考虑到这样的需求,上面的那种一般性网站就不适用了,毕竟我们的关注点是实时性而不是给用户提供漂亮的页面。万幸Python也提供了方案。异步通信,举例来说,不管在任何时候用户都可以让Josh“关闭厨房的灯”,而Josh也要及时给用户有效的反馈。传统的请求-应答循环并不非常适用。有一个流行的Python项目可以用于处理这种场景——Tornado。在项目主页的右边你可以看到开发者将这个框架归类为“异步网络库”,完美!它提供WebSockets,一种让你可以在任何时候让客户端和服务器交换数据的途径。另外一个值得研究的潜在解决方案是gevent websocket库,它使用轻量级的“绿色”线程来快速处通信问题。
10 初学者的福音
最后,许多文章源称赞Python是初学者的最佳语言。如上所述,Python从其他语言借鉴了很多元素,这让初学者有很多选择可以尝试。用户可以找到很棒的入门教程一边学习重要的编程范式一边学习如何将项目完善起来。打开终端开始测试某些python代码非常方便,设置好一个开始干活的环境也很直观。搞定了这个之后,只要你愿意,只需要import PyBrain,现在你就是一个神经网络的专家了。
对Python开发技术感兴趣的同学,欢迎加QQ群:862672474,一起学习,相互讨论。
群内已经有小伙伴将知识体系整理好(源码,笔记,PPT,学习视频),欢迎加群免费领取。