《Flask Web开发》笔记——第一章 安装
写在开头
前一段时间开始接触flask的web开发,主要的目的是给自己做一个博客网站,用于记录生活与工作。作为初学者,使用的参考书籍是Miguel Grinberg著名的“狗书”,即《Flask Web开发:基于Python的Web应用开发实战》,版本是2015年1月第一版。
断断续续地看了这本书,期间一边看也一边安照书本进行相关代码操作。现在回过头来,想想较最初贸然地开始的时候,确实也有一点点小小的进步,但后面的工作仍然是任重道远。因此在这里记下阅读该书的时候的读书笔记,供自己作为参考,也希望高手能予以指正。如果侥幸能让和我一样的初学者,在学习的过程中能少踩两个”坑“,那就是意外的收获了。
相关的一些说明如下:
1. 因为是读书笔记,所以记录大体按照该书的顺序,但也不拘泥于这个顺序。
2. 原版书籍中有部分地方,因为软件/版本的问题,目前已经不一样了,会予以标注。
3. 在读书的时候,对一些知识点,尽可能多在网络上去做一些查证、展开。
4. 我用的python版本是3.6.4。操作系统为window10。
![](https://img.haomeiwen.com/i14167845/df5a941bc7c90ea5.png)
1.Flask依赖
flask最主要依赖有两个:Werkzeug和Jinja2。其中Werkzeug是德文“工具”的意思,其提供路由、调试和Web服务器网关接口(Web Server Gateway Interface, WSGI)子系统。而Jinja这个命名挺有意思的,其来源于日语“神社”的发音[じんじゃ],而神社的英文为Temple,和模板的英文Template的发音接近,所以Jinja2的作用是为flask框架提供模板系统。
在安装flask的时候,可以发现除了Flask包和Werkzeug和Jinja2这两个依赖之外,还有三个依赖也一起被安装到电脑当中,它们是:click,MarkupSafe和itsdangerous。其各自的作用见下图所标示。
![](https://img.haomeiwen.com/i14167845/bb3ea0b9b7cd31b8.png)
2.Flask扩展
相比于其它的框架,Flask最显著的特点是:微框架。在默认情况下,Flask不支持访问数据库、Web表单验证,或用户认证等高级功能。这些功能以及其他大多数 Web 程序中需要的核心服务都以扩展的形式实现, 然后再与核心包集成。开发者可以任意挑选符合项目需求的扩展, 甚至可以自行开发。
如下图为Flask中经常用到的一些扩展,当然其中还有一些扩展并没有包括到这个图表中,需要读者根据实际进行选择。
![](https://img.haomeiwen.com/i14167845/3d98866152cc1500.png)
其中:
Flask-Script: 为Flask程序增加一个命令行解释器。
Flask-Bootstrap:集成了Bootstrap的Flask扩展,其中bootstrap是Twitter开发的一个开源框架
Flask-Moment:集成moment.js到Jinja2模板的Flask扩展
Flask-Wtf:Flask框架的表单验证模块,可以很方便生成表单,也可以当做json数据交互的验证工具,支持热插拔
Flask-SQLAlchemy:数据库操作框架,简化Flask程序中对于SQLAlchemy的操作
Flask-Migrate:数据库迁移框架
这里只是简要地说明一些这些扩展的功能,在之后的章节中,会一再用到这些扩展,到时在具体的例子中,再加以深入地学习。
!值得注意的地方是,在书中提到:这些专为 Flask 开发的扩展都暴漏在 flask.ext 命名空间,因此在书中的导入方式为:
>>>from flask.ext.script import Manager
但是实际操作中,这样的导入方式会有报错出现
>>> from flask.ext.script import Manager
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'flask.ext'
这里是因为在python3+中,flask的扩展已经不再支持从flask.ext中导入,以Flask-Script为例,其导入方式为:
>>>from flask_script import Manager
>>>Manager
>>><class 'flask_script.Manager'>
可见,扩展包的命名方式为:flask_xxx,其中xxx为扩展的名字,而不是如书中所讲放置在ext这个命名空间中。
3.使用虚拟环境
什么是虚拟环境:当我们在开始一个项目的时候,如果我们将该项目的依赖或扩展包都安装在全局python解释器的环境中,当然也是可以的。但是这样会有潜在的问题:一是在全局python解释器环境下管理所有项目的包和扩展显得非常的混乱;二是这些扩展或其版本可能与全局解释器环境中安装的其它扩展或版本有冲突。这时,如果专门为项目建立一个python解释器的私有副本,在这个私有副本的环境中安装该项目所需要的所有依赖包,这样就把该项目与全局python解释器环境隔离开来,保持了全局解释器环境的干净整洁,同时也避免了系统中依赖包之间和不同版本之间的冲突。这个python解释器的私有副本就是虚拟环境。
创建虚拟环境可以使用virtualenv这个第三方工具,名字的来源时virtual(虚拟)+ env(环境)。
virtualenv的安装:在windows中,进入anaconda的prompt窗口,采用pip可以直接安装virtualenv工具。
>>>pip install virtaulenv
创建虚拟环境:首先你需要确认创建的虚拟环境的位置,在本书中一边放置在项目文件夹下。然后确认虚拟文件夹的名称,本书采用venv,但你可以使用任何你愿意使用的名字。然后通过如下命令可以创建虚拟环境:
>virtualenv venv
当虚拟环境建立好之后,在项目文件夹下多出一个venv(此处的名称),此文件夹中保存了一个python解释器的私有副本,即虚拟环境。
但是只有先激活虚拟环境,然后将包安装在虚拟环境中,否则还是会安装在全局的python解释器中。虚拟环境的激活为:
>venv\script\activate
推出虚拟环境的命令为:
>venv\script\deactivate
![](https://img.haomeiwen.com/i14167845/efa65c9568ef8cf2.png)
创建管理虚拟环境,还可以使用集成了virtualenv工具的pyenv。在需要创建的项目文件夹下,运行如下命令创建,与virtualenv不一样的是,默认状态,pyenv会统一管理虚拟环境。
>pyenv install