Flask Web开发实战:入门、进阶与原理解析
上QQ阅读APP看书,第一时间看更新

前言

根据2018年和2019年Python开发者报告,Flask是目前最流行的Python Web框架。自2010年开源以来,受到了越来越多Python开发者的喜欢。截至2020年6月,它在GitHub上已有51000个Star,2300多位Watcher,是目前GitHub中Star数最多的Python Web框架。

Flask的logo

附注

Flask的图标虽然看起来很像辣椒,但其实它是角状的容器(powder horn)。

Flask仅保留了Web框架的核心,其他的功能都交给扩展实现。如果没有合适的扩展,你甚至可以自己编写。Flask不会替你做决定,也不会限制你的选择。它足够轻量,你可以只用5行就编写出一个最简单的Web程序,但并不简陋,它能够适应各类项目的开发。

因为Flask的灵活性,越来越多的公司选择Flask作为Web框架,甚至开始从Django迁移到Flask。使用Flask的公司在国外有Netflix、Reddit、Twilio、Mailgun等,在国内则有豆瓣、果壳、下厨房等,这说明Flask能经受大型项目的挑战,能够适应各种需求。下图列出了部分使用Flask的公司。

附注

你可以在Stack Share上查看完整的使用Flask的公司列表(https://stackshare.io/flask)。

使用Flask的公司

在国内,越来越多的Python程序员开始关注和学习Flask。对于国内的程序员来说,相关书籍仅有一两本,内容上也过于陈旧和单薄,希望本书可以填补这一空白。本书提供了学习Flask的完整路径,从基础内容到进阶实践,再到源码分析。同时也安排了丰富的示例程序,让读者可以通过亲自实践来更快地掌握Flask开发。

Flask自2010年开源以来在Google上的搜索趋势

参考来源:Google Trends(https://trends.google.com/trends/explore?date=2010-04-01%202018-04-01&q=%2Fm%2F0dgs72v)。

目标读者

在技术层面,本书适合所有Python程序员(了解Python即可)阅读,包括已经学习过其他Python Web框架(比如Django)的读者和没有接触过Web框架的读者。

在难度水平层面,本书适合新手以及中级读者阅读。新手会在这里学到Flask的基础内容,并且通过丰富、完善的实例学习Flask开发的方方面面;中级读者则可以通过阅读和实践进阶内容来进一步提高Flask开发能力。

综上所述,本书主要适合以下几类读者:

❑ 了解Python基本语法,想要自己动手做网站的编程爱好者。

❑ 熟悉Python,想要从事Python Web开发的后端工程师、运维工程师和爬虫工程师。

❑ 想要从Django等其他Python Web框架转向Flask的Python工程师。

本书主要特点

本书主要有三个显著的特点:

(1)内容全面

本书内容覆盖了Flask Web开发的完整路径:从基础知识的学习,到不同类型和复杂程度的程序的编写,再到代码的测试优化以及Flask源码分析;从基础的内容管理,到用户认证和权限管理,再到Flask与Java Script的数据交互、Web API的编写以及Web Socket的应用等。

(2)实践丰富

本书包含大量代码片段,并附带多个完整可运行的示例程序。在本书第一部分的第2~6章均分别提供一个示例程序;第二部分则会通过介绍5个比较完善的Flask项目来讲解各个方面的进阶知识;在第三部分还会通过一个真实的扩展来讲解Flask扩展开发。通过将各类知识融入实际的项目开发实践中,可以让你更直观地了解具体的代码实现,并且快速应用到实际开发中。

(3)内容最新

本书的另一个特点就是内容保证最新。书中的代码和示例程序都基于Flask最新发布的稳定版1.0。书中涉及的其他Pyhton包和前端框架(Boostrap、Materialize等)全部使用最新版本,并且对未来可能会有的变化会加以说明。这些特点可以保证书中的内容在一定时间内不会过时。对于其他书籍或教程中存在的关于Flask的误区,本书也会逐一纠正说明。

除了使用的工具保持最新,本书还引入了Python和Flask开发中的新变化,比如Flask的命令行系统、新的Python包管理工具(Pipenv)、新的包上传工具(twine)、新的Py PI站点(https://pypi.org)、在Py PI上使用Markdown格式的README……

本书核心内容

本书由三部分组成,分别为基础篇、实战篇、进阶篇,共16章。本书章节经过精心设计,力求让读者可以循序渐进地掌握Flask开发的基础知识和技巧。

第一部分:基础篇。介绍Flask开发相关的基础知识。

❑ 第1章:搭建开发环境,编写一个最小的Flask程序并运行它,了解Flask基本知识。

❑ 第2章:介绍Flask与HTTP的交互方式以及相关的Flask功能。

❑ 第3章:介绍Jinja2模板的使用。

❑ 第4章:介绍Web表单的创建和表单数据的验证。

❑ 第5章:介绍在Flask程序中使用数据库进行CRUD操作。

❑ 第6章:介绍在Flask程序中发送电子邮件的几种方式。

第二部分:实战篇。通过几个示例程序来介绍Flask开发中各类功能的实现方法和技巧。

❑ 第7章:通过一个简单的留言板程序Say Hello介绍Web开发的基本流程和基本的项目管理方式,对第一部分的基础知识进行简单回顾。

❑ 第8章:通过个人博客程序Bluelog介绍CRUD操作、用户认证、文章评论、管理后台等功能。

❑ 第9章:通过图片社交程序Albumy介绍用户注册和认证、用户权限管理、图片上传与处理、用户头像、复杂的数据库关系、复杂的数据库查询、全文搜索等内容。

❑ 第10章:通过待办事项程序Todoism介绍单页应用、国际化与本地化、Web API、OAuth服务器端实现等内容。

❑ 第11章:通过聊天室程序Cat Chat介绍Websocket应用、OAuth客户端实现(第三方登录)、Markdown支持、代码语法高亮等内容。

第三部分:进阶篇。介绍Flask程序的部署流程,如测试、性能优化、部署上线;介绍Flask开发的进阶话题,如Flask扩展开发、Flask源码与机制分析。

❑ 第12章:介绍Flask程序的自动化测试,包括单元测试和UI测试的编写、计算测试覆盖率和代码质量检查。

❑ 第13章:介绍对Flask程序进行性能优化的主要措施,包括函数与数据库查询的性能分析、缓存的使用、静态文件优化。

❑ 第14章:介绍部署Flask程序前的准备,以及部署到Linux服务器和云平台Heroku、Python Anywhere的完整流程。

❑ 第15章:通过扩展Flask-Share来介绍编写Flask扩展的完整流程,从创建项目到上传到Py PI。

❑ 第16章:介绍Flask的一些设计理念,包括底层WSGI的相关实现,并对各个主要功能点进行源码分析。

此外,书的最后还提供了附录A,补充介绍一些Flask学习相关的资源。

阅读前的准备

在开始我们的Flask之旅前,还有一些准备工作要做。首先,你要有一台安装了Python(https://www.python.org/)的电脑,并且,你要了解Python的基础知识。

提示

本书中所有示例程序的代码均通过了Python 2.7和Python 3.6的测试,建议你选用这两个版本。因为大多数Python包(包括Flask)已经不再支持Python 2.6及以下版本,以及Python 3.3及以下版本,确保不要使用这些版本。另外,Python官方社区将于2020年1月1日停止对Python 2.×的维护,这或许可以作为你选择Python版本时的考量之一。

其次,本书有大量操作需要在命令行(CLI,Command Line Interface)下进行,所以你要熟悉你所在操作系统下的命令行。书中会在涉及操作系统特定的命令时给出提示,Windows系统给出的命令对应的是CMD.exe,Linux和mac OS系统则对应的是Bash。

最后,HTML、CSS、Java Script分别作为一个Web页面的结构层、表现层和行为层,是Web开发的基础,你需要对它们有基本的了解。任何一个Web程序都是由单个或多个Web页面,页面上包含的内容,以及按钮、表单等交互组件构成的。在本书中,我们会使用Flask操作HTML页面;为了让HTML页面更加美观,我们会使用CSS定义样式,为了简化编写样式的操作,我们会使用CSS框架,比如Bootstrap(http://getbootstrap.com/);为了让某些操作更加合理和方便,或为了给程序增加动画效果,我们会使用Java Script来操作页面元素,为了简化编写Java Script的工作,我们会使用Java Script库j Query(https://jquery.com/)。

附注

在Web开发中,大部分程序离不开Java Script,Java Scipt可以很方便、简洁地实现很多页面逻辑和功能。为了更多地介绍Flask,本书将尽量避免使用过多的Java Scipt代码。

如果你还不熟悉这些内容,那么可以通过下面的网站来快速入门:

❑ W3Schools(https://www.w3schools.com)。

❑ MDN Web文档(https://developer.mozilla.org/docs/Web)。

❑ Codecademy(https://www.codecademy.com)。

使用示例程序

示例程序均使用Git来管理程序版本,为了便于大家获取示例程序,代码均托管在Git Hub(https://github.com/)上。Git(https://git-scm.com/)是最流行的开源VCS(Version Control System,版本控制系统),大多数项目都使用它来追踪文本文件(代码)的变化。Git非常易于上手,如果你还不熟悉它,可以访问Try Git(https://try.github.io/)来快速了解Git。

你可以访问Git官网的下载页面(https://git-scm.com/downloads)了解不同操作系统下Git的安装方法,安装成功后即可使用它来获取示例程序。下面介绍了两种使用示例程序的方式。

1.阅读示例程序

因为示例程序都托管在Git Hub上,所以阅读示例程序最简单的方式是在浏览器中阅读。在对应的章节,我们会给出示例程序在Git Hub上的仓库链接。

如果要在本地阅读,那么首先使用git clone命令把Git Hub上的示例程序克隆(即复制)到本地,以本书的项目仓库为例:

        $ git clone https://github.com/greyli/helloflask.git

提示

clone命令后面的参数是远程Git仓库的URL,最后的“.git”后缀可以省略。这里的URL中的传输协议使用了http(s)://协议,你也可以使用git://协议,即git://github.com/greyli/helloflask.git

使用ls(即List)命令(Windows下使用dir命令)列出当前目录下的文件信息,你会看到当前目录中多了一个helloflask文件夹,这就是我们刚刚复制下来的项目仓库。下面使用cd(即change directory)命令切换进这个文件夹:

        $ cd helloflask

现在你可以使用你喜欢的文本编辑器打开项目文件夹并准备阅读了。建议使用轻量的文本编辑器来阅读示例代码,比如Atom(https://atom.io/)、Sublime Text(https://www.sublimetext.com/)或Notepad++(https://notepad-plus-plus.org/)。

在对应章节的开始处都会包含从Git Hub复制程序、创建虚拟环境并运行程序的基本步骤,你可以一边阅读源码,一边实际尝试使用对应的程序功能。

示例程序根据章节内容设置了对应的标签,每个标签都对应了一个程序版本。你可以使用git tag-n命令查看当前项目仓库中包含的所有标签:

        $ git tag -n

使用git checkout命令即可签出对应标签版本的代码,添加标签名作为参数,比如:

        $ git checkout foo

在后面,书中会在每一次包含更改文件的章节提示应该签出的标签名。如果在执行新的签出命令之前,你对文件做了修改,那么需要使用git reset命令来撤销改动:

        $ git reset --hard

注意

git reset命令会删除本地修改,如果你希望修改示例程序源码并保存修改,可以参考后面的“改造示例程序部分”。

如果你想比较两个版本之间的变化,可以使用git diff命令,添加比较的两个标签作为参数,比如:

        $ git diff foo bar

如果你想更直观地查看版本变化,可以使用下面的命令打开内置的Git浏览客户端:

        $ gitk

除了内置的Git客户端,还有大量的第三方客户端可以使用,详情可以访问https://git-scm.com/downloads/guis查看。另外,你也可以访问Git Hub的Web页面查看不同版本(标签)的变化,即查看某项目两个版本之间的变化可以访问https://github.com/用户名/仓库名/compare/标签A...标签B,比如对foo和bar标签进行比较可以访问https://github.com/greyli/helloflask/compare/foo...bar

最后,你可以定期使用git fetch命令来更新本地仓库:

        $ git fetch --all
        $ git fetch --tags
        $ git reset --hard origin/master

2.改造示例程序

只看菜谱是不能学会烹饪的,自己动手编写代码才是学习Flask最有效的途径。你可以在阅读示例程序的同时编写自己的Flask程序,将书中介绍的内容和实际的示例程序代码作为参照。另外,你也可以创建一份示例程序的拷贝(派生,fork),这样你就可以自由地修改示例程序的源码,改造成你自己的示例程序。创建派生仓库的主要步骤如下:

1)注册一个Git Hub账号(https://github.com)。

2)访问示例程序的Git Hub仓库页面(比如https://github.com/greyli/helloflask),单击右上角的Fork按钮创建一个派生仓库,如下图所示。

创建派生仓库

3)在本地使用git clone命令复制新创建的派生仓库,使用你的用户名构建URL:

        $ git clone https://github.com/你的用户名/helloflask.git

现在你可以在本地自由修改实例程序,并提交到你的Git Hub账户的远程仓库中了。

排版约定

Windows中的命令提示符为“>”,而Linux或mac OS中的命令提示符为“$”,本书中将统一使用美元符号(即“$”)作为命令提示符,比如:

        $ cd hello

命令提示符为三个大于号(即“>>>”)的表示Python Shell中输入的代码,比如:

        >>> import os

“$”或“>>>”标记的文本下方没有命令提示符的文字表示输出的字符,不需要打出,比如:

        $ cat hello.txt
        Hello, Flask!

为了节省篇幅,本书中的代码片段没有严格遵照PEP8的约定,比如类和函数之间的空行被缩减为1行。另外,出现过的导入语句和无关的代码块会被省略掉。为了节省篇幅,代码中重复或不相干的部分都使用三个省略号代替,比如:

        def do_someting():
            ...
            if foo:
                return False
            return True

代码、命令或URL中有时会使用“<”和“>”来标识演示内容,在实际输入中并不需要写出,比如:

        https://github.com/<你的用户名>

因为在示例代码中通常会引入大量随机字符,这些随机字符包含下面的使用规则。

❑ 列表1:spam、ham、eggs。

❑ 列表2:foo、bar、baz、qux、quux、quuz、corge、grault、garply、waldo、fred。

❑ 人名会使用Grey Li或grey。

❑ 网站会使用helloflask.com或example.com。

❑ 其他需要读者自己修改的占位字符会使用类似your_password、you_email的文本。

最后,为了尽量让正文保持简洁,每一章新涉及的Python库都会在第一小节前汇总列出对应的版本和相关链接(比如主页、源码和文档)。因为大部分项目在Py PI上提供的介绍都不够完善,除非程序有独立的主页,否则会优先使用Git Hub或Bit Bucket上的项目页面作为主页。

读者反馈与疑问

由于笔者水平有限,编写时间也比较仓促,书中难免有错误或者不全面的地方,在此恳请读者朋友批评指正。

关于本书的疑问和反馈可以到本书在Git Hub上的项目仓库Hello Flask(https://github.com/greyli/helloflask)中创建Issue并提交;书中的错误或笔误可以修改仓库中的勘误文件(Errata.md)并提交Pull Request。

对于示例程序的疑问、反馈和改进建议可以到示例程序在Git Hub上的项目仓库提交Issue或Pull Request,具体的网址可以在对应的章节看到。

当然,你也可以直接发邮件与笔者联系,笔者的邮箱是withlihui@gmail.com。

本书的配套资源索引可以在本书的主页http://helloflask.com/book上看到。另外,你可以访问笔者的博客(http://greyli.com)或是知乎专栏“Hello,Flask!”(https://zhuanlan.zhihu.com/flask)阅读更多与Flask相关的文章。

致谢

首先,感谢机械工业出版社华章公司的杨福川老师和李艺老师。因为杨老师的信任,才让笔者有幸写作这本书。本书能够顺利完成,离不开两位老师的悉心指导,更离不开其他编辑的辛苦工作。

其次,感谢Flask社区和其他开源项目的贡献者们创造了这一切,也感谢在Stack Overflow、Git Hub、Reddit和Wikipedia等网站贡献知识的开发者们。

最后,感谢父母和奶奶这段时间的支持和帮助,也感谢女友魏瑶和弟弟家辉给予的鼓励和陪伴。