前言

前言

和其他框架相比,Flask之所以能脱颖而出,原因在于它让开发者做主,使其能对程序具有全面的创意控制。或许你曾听过“和框架斗争”这一说法。在大多数框架中,当你决定使用的解决方案不受框架官方支持时就会发生这种情况。你可能想使用不同的数据库引擎或者不同的用户认证方法。但是,这种偏离框架开发者设定路线的做法往往会给你带来很多麻烦。

Flask就不一样了。你喜欢关系型数据库?很好。Flask支持所有的关系型数据库。或许你更喜欢使用NoSQL数据库?没问题,Flask也支持。想使用自己开发的数据库引擎?根本用不到数据库?依然没问题。在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上获取1https://github.com/miguelgrinberg/flasky

1也可注册iTuring.cn,在本书页面免费下载。——编者注

这个仓库的提交历史被精心设置为与本书所介绍的功能顺序一致。使用这份代码时,我建议你从最早的提交开始,顺着本书内容的进度,向前推移查看提交列表。另外,你还可以从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章使用程序的初始版本。大多数章都不止使用一个标签,例如5a5b等分别对应第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命令后,本地修改会丢失。

另一个有用的操作是查看程序两个版本之间的区别,以便了解改动详情。在命令行中,你可以使用git diff命令进行查看。例如,执行下述命令可以查看2a2b两个修订版本之间的区别:

$ git diff  2a 2b

这个命令以补丁(patch)的形式显示区别,如果你以前没有用过补丁文件,可能会觉得这种查看变动的方式不直观。你可能发现,GitHub网站中显示的图形化对比更容易让人理解。例如,在GitHub中查看2a2b两个历史版本的区别,可以访问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'Reilly Media、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、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的帮助,他对这个程序做了完整的代码审查,并指出了很多可改进之处。还要感谢我十几岁的儿子Dylan Grinberg,他暂时克服了Minecraft这款游戏的强大吸引力,用几周时间帮助我在不同平台上测试这些代码。

O'Reilly有个极好的项目名为Early Release(提早发布),可以让迫不及待的读者在图书撰写过程中就进行阅读。很多抢先阅读的读者并不局限于阅读本书,还加入了讨论行列,讨论他们使用本书的体验,这为本书的改进做出了极大贡献。在这些读者中,我要特别感谢Sundeep Gupta、Dan Caron、Brian Wisti和Cody Scott对本书所做的贡献。

O'Reilly Media的工作人员始终陪伴着我。首先我要特别感谢本书的编辑Meghan Blanchette,她从我们见面的第一天起,就给予我无尽的支持、建议和协助。她把我写作第一本书的过程变成了美好的回忆。

最后,请让我对Flask社区表示由衷的感谢。

目录

  • 版权声明
  • O'Reilly Media, Inc.介绍
  • 前言
  • 第一部分 Flask简介
  • 第 1 章 安装
  • 第 2 章 程序的基本结构
  • 第 3 章 模板
  • 第 4 章 Web表单
  • 第 5 章 数据库
  • 第 6 章 电子邮件
  • 第 7 章 大型程序的结构
  • 第二部分 实例:社会化博客程序
  • 第 8 章 用户认证
  • 第 9 章 用户角色
  • 第 10 章 用户资料
  • 第 11 章 博客文章
  • 第 12 章 关注者
  • 第 13 章 用户评论
  • 第 14 章 应用编程接口
  • 第三部分 成功在望
  • 第 15 章 测试
  • 第 16 章 性能
  • 第 17 章 部署
  • 第 18 章 其他资源
  • 关于封面图