和其他框架相比,Flask 之所以能脱颖而出,原因在于它让开发者做主,使其能对程序具有全面的创意控制。或许你曾听过“和框架斗争”这一说法。在大多数框架中,当你决定使用的解决方案不受框架官方支持时就会发生这种情况。你可能想使用不同的数据库引擎或者不同的用户认证方法。但是,这种偏离框架开发者设定路线的做法往往会给你带来很多麻烦。
Flask 就不一样了。你喜欢关系型数据库?很好。Flask 支持所有的关系型数据库。或许你更喜欢使用NoSQL 数据库?没问题,Flash 也支持。想使用自己开发的数据库引擎?根本用不到数据库?依然没问题。在Flask 中,你可以自主选择程序的组件,如果找不到合适的,还可以自己开发。就这么简单。
Flask 之所以能给用户提供这么大的自由度,关键在于其开发伊始就考虑到了扩展性。
Flask 提供了一个强健的核心,其中包含每个Web 程序都需要的基本功能,而其他功能则交给行业系统中的众多第三方扩展,当然,你也可以自行开发。
在本书中,我展示自己使用Flask 开发Web 程序的工作流程。我不觉得这是使用Flask 开发程序的唯一正确方式。你应该把我的选择作为一种推荐方式,而不是真理。
大部分软件开发类图书都使用短而精的示例代码,孤立地演示所介绍技术的功能,让读者自己去思考如何使用“胶水”代码把这些不同的功能结合起来,从而开发出完整可用的程序。在本书中,我采用了完全不同的方式。我使用的示例代码都摘自同一个程序,开始时很简单,后续逐章进行扩展。最初这个程序只有几行代码,最后将变成功能完善的博客和社交网络程序。
面向的读者群
要想很好地理解本书内容,你需要具备一定的Python 编程经验。阅读本书并不要求你了解Flask 的相关知识,但你最好能理解Python 中的一些概念,例如包、模块、函数、修饰器和面向对象编程。熟悉异常处理,知道如何从栈跟踪中分析问题也对理解本书有帮助。
学习本书示例代码时,你大部分时间都要在命令行中进行操作。因此,你应该能够熟练使用自己操作系统中的命令行。
现代Web 程序都不可避免地需要使用HTML、CSS 和JavaScript。本书开发的示例程序当然也用到了这些技术,但本书没有对其进行详细介绍,也没有说明应该如何使用。因此,如果你想开发完整的程序,且无法向精通客户端技术的开发者寻求帮助,那就需要对这些语言有一定程度的了解。
本书附带的程序是开源的,我把它上传到了GitHub。虽然可以从GitHub 上下载ZIP 或TAR 格式的程序源码,但我还是强烈建议你安装Git 客户端,以便熟悉怎么使用源码版本控制系统,至少知道如何直接从仓库中克隆源码以及如何切换到程序的不同版本。接下来的“如何使用示例代码”部分会介绍几个你需要知道的命令。你或许希望在自己的项目中使用版本控制,那就把本书作为学习Git 的一个契机吧。
最后要说明的是,本书并不是完整且详尽介绍Flask 框架的手册。本书介绍了Flask 的大部分功能,但你还需要配合使用Flask 官方文档(http://flask.pocoo.org/)。
本书结构
本书分为三部分。
第一部分Flask 简介简要介绍如何使用Flask 框架及其一些扩展开发Web 程序。
· 第1 章说明如何安装和设置Flask框架;
· 第2 章通过一个简单的程序介绍如何使用Flask;
· 第3 章介绍如何在Flask程序中使用模板;
· 第4 章介绍Web 表单;
· 第5 章介绍数据库;
. · 第6 章介绍如何实现电子邮件支持;
· 第7 章提供一个可供中大型程序使用的程序结构。
第二部分 实例:社交博客程序开发Flasky,这是我为本书开发的开源博客和社交网络程序。
· 第8 章实现用户认证系统;
· 第9 章实现用户角色和权限;
· 第10 章实现用户资料页;
· 第11 章开发博客界面;
· 第12 章实现关注功能;
· 第13 章实现博客文章的用户评论功能;
· 第14 章实现应用编程接口(Application Programming Interface,API)。
第三部分成功在望介绍与开发程序没有直接关系,但在程序发布之前要考虑的事项。
· 第15 章详细说明各种单元测试策略;
· 第16 章简要介绍性能分析技术;
· 第17 章说明Flask程序的部署方式,包含传统方式和云方式;
· 第18 章列出其他资源。
如何使用示例代码
本书使用的示例代码可在GitHub 上获取1:https://github.com/miguelgrinberg/flasky。
这个仓库的提交历史被精心设置为与本书所介绍的功能顺序一致。使用这份代码时,我建议你从最早的提交开始,顺着本书内容的进度,向前推移查看提交列表。另外,你还可以从GitHub 上下载每次提交代码后得到的ZIP 或TAR 文件。
如果你决定使用Git 操作源码,那么首先要安装Git 客户端(可以从http://git-scm.com/ 下载)。下述命令就使用Git 下载示例代码:
$ git clone https://github.com/miguelgrinberg/flasky.git
git clone 命令从GitHub 上下载源码,安装到当前目录下的flasky 文件夹中。这个文件夹中不仅有源码,还有一个包含了程序修改完整历史的Git 仓库。
第1 章会要求你签出程序的初始发布版本,然后在适当的时候指示你需要向前推进查看提交历史。切换提交历史的Git 命令是git checkout。下面举个例子:
$ git checkout 1a
上述命令中的1a 代表一个标签(tag),是项目中某次提交历史的名字。这个仓库的标签根据本书的章节命名,因此本例中的1a 表示第1 章使用程序的初始版本。大多数章都不止使用一个标签,例如5a 和5b 等分别对应第5 章中使用到的不同版本。
除了签出程序源码的不同版本,你可能还需要进行一些设置。例如,你有时需要安装额外的Python 包,或者升级数据库。需要执行这些操作时,我会提醒你。
一般情况下,你无需修改程序的源文件,但如果修改了,Git 会阻止你签出其他历史版本,因为这会导致本地修改历史的丢失。签出其他历史版本之前,你要把文件还原到原始状态。最简单的方法是使用git reset 命令:
$ git reset --hard
这个命令会损坏本地修改,所以执行此命令前你需要保存所有不想丢失的改动。
你可能经常需要从GitHub 上下载修正和改进后的源码用于更新本地仓库。完成这个操作的命令如下所示:
$ git fetch --all
$ git fetch --tags
$ git reset --hard origin/master
git fetch 命令用于利用GitHub 上的远程仓库更新本地仓库的提交历史和标签,但不会改动真正的源文件,随后执行的git reset 命令才是用于更新文件的操作。再次提醒,执行git reset 命令后,本地修改会丢失。
编注1: 也可注册iTuring.cn,在本书页面免费下载。
另一个有用的操作是查看程序两个版本之间的区别,以便了解改动详情。在命令行中,你可以使用git diff 命令进行查看。例如,执行下述命令可以查看2a 和2b 两个修订版本之间的区别:
$ git diff 2a 2b
这个命令以补丁(patch)的形式显示区别,如果你以前没有用过补丁文件,可能会觉得这种查看变动的方式不直观。你可能发现,GitHub 网站中显示的图形化对比更容易让人理解。例如,在GitHub 中查看2a 和2b 两个历史版本的区别,可以访问https://github.com/
miguelgrinberg/flasky/compare/2a...2b。
使用代码示例
本书的目的是帮助你完成工作。一般来说,你可以在自己的程序或者文档中使用本书附带的示例代码。你无需联系我们获得使用许可,除非你要复制大量的代码。例如,使用本书中的多个代码片段编写程序就无需获得许可。但以CD-ROM 的形式销售或者分发O’Reilly书中的示例代码则需要获得许可。回答问题时援引本书内容以及书中示例代码,无需获得许可。在你自己的项目文档中使用本书大量的示例代码时,则需要获得许可。
我们不强制要求署名,但如果你这么做,我们深表感激。署名一般包括书名、作者、出版社和国际标准图书编号。例如:Flask Web Development by Miguel Grinberg (O’Reilly).Copyright 2014 Miguel Grinberg, 978-1-449-3726-2。
如果你觉得自身情况不在合理使用或上述允许的范围内,请通过邮件和我们联系,地址是permissions@oreilly.com。
排版约定
本书使用了下述排版约定。
楷体
标示新术语。
等宽字体(constant width)
表示程序代码,也表示正文中出现的变量、函数名、数据库、数据类型、环境变量、语句和关键字等。
加粗等宽字体(constant width)
命令或是其他应该由用户输入的内容。
斜体等宽字体(constant width)
表示需要使用用户的输入值代替的文本,或者由上下文决定的值。
这个图标表示提示或建议。
这个图标表示一般性说明。
这个图标表示警告或提醒。
Safari? Books Online
Safari Books Online(http://my.safaribooksonline.com/?portal=oreilly)是应需而变的数字图书馆,它同时以图书和视频的形式出版世界顶级技术和商务作家的专业作品(http://www.safaribooksonline.com/content)。
Safari Books Online 是技术专家、软件开发人员、Web 设计师、商务人士和创意人士开展调研、解决问题、学习和认证培训的第一手资料。
Safari 在线图书馆为组织(http://www.safaribooksonline.com/enterprise)、政府部门(http://www.safaribooksonline.com/government) 和个人(http://www.safaribooksonline.com/) 提供了不同的产品组合和灵活的定价策略。订阅者可以在一个开放搜索的全文数据库中访问上千种图书、培训视频和正式出版之前的书稿。这些内容由以下出版社提供:O’ReillyMedia、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、John Wiley & Sons、Syngress、MorganKaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、NewRiders、McGraw-Hill、Jones & Bartlett 和Course Technology,等等(http://www.safaribooksonline.com/publishers)。若想了解关于Safari Books Online 的更多信息,请访问我们的网站(http://www.safaribooksonline.com)。
联系我们
请把对本书的意见和疑问发送给出版社。
美国:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国:
北京市西城区西直门南大街2 号成铭大厦C 座807 室(100035)
奥莱利技术咨询(北京)有限公司
O’Reilly 的每一本书都有专属网页,你可以在那儿找到本书的相关信息,包括勘误表、示例代码以及其他信息。本书的网站地址是:
http://shop.oreilly.com/product/0636920031116.do。
如果你对本书有一些建议或技术上的疑问,请发送电子邮件至bookquestions@oreilly.com。
要了解更多O’Reilly 图书、培训课程、会议和新闻的信息,请访问以下网站:
http://www.oreilly.com。
我们在Facebook 的地址如下:http://facebook.com/oreilly
请关注我们的Twitter 动态:http://twitter.com/oreillymedia
我们的YouTube 视频地址如下:http://www.youtube.com/oreillymedia
致谢
我一个人是无法完成这本书的。家人、同事、老友,以及写书过程中认识的新朋友都给了我很大的帮助。
我要感谢Brendan Kohler,他对本书做了详尽的技术审校,并为第14 章的成型提供了宝贵建议。我还要感谢David Baumgold、Todd Brunhoff、Cecil Rock 和Matthew Hugues,他们在本书撰写的不同阶段审阅了书稿,并对涵盖内容和组织方式给予了建设性建议。
本书示例代码的编写花费了我的大量精力。我很感激Daniel Hofmann 的帮助,他对这个程序做了完整的代码审查,并指出了很多可改进之处。还要感谢我十几岁的儿子DylanGrinberg,他暂时克服了Minecraft 这款游戏的强大吸引力,用几周时间帮助我在不同平台上测试这些代码。
O’Reilly 有个极好的项目名为Early Release(提早发布),可以让迫不及待的读者在图书撰写过程中就进行阅读。很多抢先阅读的读者并不局限于阅读本书,还加入了讨论行列,讨论他们使用本书的体验,这为本书的改进做出了极大贡献。在这些读者中,我要特别感谢Sundeep Gupta、Dan Caron、Brian Wisti 和Cody Scott 对本书所做的贡献。
O’Reilly Media 的工作人员始终陪伴着我。首先我要特别感谢本书的编辑MeghanBlanchette,她从我们见面的第一天起,就给予我无尽的支持、建议和协助。她把我写作第一本书的过程变成了美好的回忆。
最后,请让我对Flask 社区表示由衷的感谢。