定义:Flask 是使用Python 编写的Web 微框架。Web 框架可以让我们不用关心底层的请求响应处 理, 更方便高效地编写Web 程序。因为Flask 核心简单且易于扩展,所以被称作微框架。Flask 有两个主要依赖, 一个是 WSGI(Web Server Gateway Interface)工具集一Werkzeug;另一个是Jinja2 模板引擎。
Flask 只保留了Web 开发的核心功能,其他的功能都由外部扩展来实现,比如数据库 集成、表单认证、文件上传等。如果没有合适的扩展,你甚至可以自己动手开发。Flask 不会替你 做决定,也不会限制你的选择。总之, Flask 可以变成任何你想要的东西, 一切都由你做主。
WSGI (Web Server Gateway Interface )是Python 中用来规定Web 服务器如何与Python Web 程序进行沟通的标准,在本书的第三部分将进行详细介绍。

1. 开发环境

1.1 pipenv工作流

1.1.1 安装pipenv

Pipenv 是基于pip 的Python 包管理工具,它和pip 的用法非常相似,可以看作pip 的加强版,它的出现解决了旧的p ip+virtualenv+requirements. txt 的工作方式的弊端。具体来说,它是 pip 、Pipfile 和Virtualenv 的结合体,它让包安装、包依赖管理和虚拟环境管理更加方便,使用 它可以实现高效的Python 项目开发工作流。
pip —version命令检查是否已经安装pip
pip install 〈某个包的名称〉从pypi(python package index)上安装包,它是一个Python包的在线仓库。
pip install pipenv
虚拟环境( virtual enviroment )就是隔离的Python 解释器环境。通过创建虚 拟环境,你可以拥有一个独立的Pyth on解释器环境。

1.1.2 创建虚拟环境

虚拟环境通常使用Virualenv 来创建,但是为了更方便地管理虚拟环境和依赖包,我们将 会使用集成Virtualenv 的Pipenv 。首先确保我们当前工作目录在项目的根目录,然后使用pipenv install 命令为当前的项目创建虚拟环境。如果该目录中包含pipfile,那么虚拟环境中讲会直接安装这些包。你可以通过一three 和一two 选项未声明虚拟环境中使用的Python 版本(分别对应 咽, 由Python3 和Python2 ),或是使用一python 选项指定具体的版本号。同时要确保对应版本 的Python 已经安装在电脑中。
默认情况下, Pipen管理所有虚拟环境。在Windows 系统中,虚拟环境文件夹 会在C: \U sers\Administrator. virtualenvs\ 目录下创建。如果想在当前目录中创建,查看博客的另一篇文章
PIPENV_VENV_IN_PROJECT环境变量设置问题
如果是在默认的文件夹下,那么虚拟环境文件夹命名是当前项目目录名+ 一串随机字符。在单独使用Virtualenv 时,我们通常会显式地激活虚拟环境。在Pipenv 中,可以使用 pipenv shell 命令显式地激活虚拟环境:
当执行仰pipenv shell或者pipenv run 命令时, Pipenv 会自动从项目目录下的.env 文件中加 载环境变量。命令行提示符前添加了虚拟环境 名“(虚拟环境名称)$”。
除了显式地激活虚拟环境, Pipenv 还提供了一个pipenv run 命令,这个命令允许你不显式 激活虚拟环境即可在当前项目的虚拟环境中执行命令, 比如: $ pipenv run python hello.py。这会使用虚拟环境中的Python 解释器,而不是全局的Python 解释器。事实上,和显式激活 /关闭虚拟环境的传统方式相比, pipenv run 是更推荐的做法,因为这个命令可以让你在执行操 作时不用关心自己是否激活了虚拟环境。

1.1.3 管理依赖

在以前我 们通常使用pip 搭配一个requirements.txt 文件来记录依赖。但requirements . txt 需要手动维护,
在使用上不够灵活。Pipfile 的出现就是为了替代难于管理的requirements.txt 。
在创建虚拟环境时,如果项目根目录下没有Pipfile 文件, pipenv install 命令还会在项目文 件夹根目录下创建Pipfile 和Pipfile. lock 文件,前者用来记录项目依赖包列表,而后者记录了固 定版本的详细依赖包列表。当我们使用Pipenv 安装/删除/更新依赖包时, Pipfile 以及Pipfile. lock 会自动更新。
pip graph可以用来查看当前环境下的依赖情况。

1.2 安装Flask

pipenv install flask无论是否激活了虚拟环境,都会将包安装到虚拟环境中去。
image.png

2. Hello,Flask

image.png

2.1 创建程序实例

我们安装Flask 时,它会在Python 解释器中创建一个flask 包,我们可以通过flask 包的构 造文件导入所有开放的类和函数。我们先从flask 包导入Flask 类,这个类表示一个Flask 程序。 实例化这个类,就得到我们的程序实例app。
传人Flask 类构造方法的第一个参数是模块或包的名称,我们应该使用特殊变量name。Python 会根据所处的模块来赋予_name_ 变量相应的值,对于我们的程序来说( app.py ) ,这 个值为app 。除此之外,这也会帮助F la sk 在相应的文件夹里找到需要的资源,比如模板和静态 文件。

2.2 注册路由

image.png
视图函数返回的值是响应的主体。一个视图函数可以绑定多个url,还可以在URL 规则中添加变量部分,使用“< 变 量名>”的形式表示。因为URL中包含变量,所以是URL规则,而不是URL。
image.png

3. 启动开发服务器

Flask 内置了一个简单的开发服务器( 由依赖包Werkzeug 提供),足够在开发和测试阶段 使用。

3.1 Run,Flask

Flask 通过依赖包Click 内置了一个CLI ( Command Line Interface , 命令行交互界面)系统。 当我们安装Flask 后, 会自动添加一个flask 命令脚本,我们可以通过flask 命令执行内置命令、 扩展提供的命令或是我们自己定义的命令。其中, flask run 命令用来启动内置的开发服务器。默认监听本地5000端口。

3.1.1 程序实例的发现

Flask按照以下规则寻找:

  • 从当前目录寻找app . py 和wsgi.py 模块,并从中寻找名为app 或application 的程序 实例。
  • 从环境变量FLASK_APP中寻找

    1. windows中手动设置环境变量:set FLASK APP=hellolinux下:export FLASK APP=hello

    3.1.2 管理环境变量

    如果安装了python-dotenv ,那么在使用 flask run 或其他命令时会使用它自动从.flaskenv 文件和.env 文件中加载环境变量。
    image.png
    image.png

    3.2 更多的启动选项

    FLASK_RUN_HOST 和 FLASK_RUN_POR都可以在.flaskenv中设置。类似命令也可以如此。

    3.2.1 服务器外部可见

    flask run — host 0.0.0.0

    3.2.2 改变默认端口

    flask run —port=8 000

    3.3 设置运行环境

    开发环境( development enviroment )和生产环境( production enviroment )是我们后面会频 繁接触到的概念。开发环境是指我们在本地编写和测试程序时的计算机环境,而生产环境与开 发环境相对,它指的是网站部署上线供用户访问时的服务器环境。
    在.flaskenv中设置FLASK_ENV=development。调试模式( Debug Mode )将被开启,这时执行flask run 启动程序会自 动激活Werkzeug 内置的调试器( debugger )和重载器( reloader )。生产环境下绝对不可开启调试模式。
    调试器允许你在错误页面上执行Python 代码。单击错误信息右侧的命令行图标, 会弹出 窗口要求输入PIN 码,也就是在启动服务器时命令行窗口打印出的调试器PIN 码( Debugger PIN ) 。输入PIN 码后,我们可以单击错误堆桔的某个节点右侧的命令行界面图标,这会打开一个包含代码执行上下文信息的Python Shell ,我们可以利用它来进行调试。
    重载器检测到改变后,自动重启服务器。默认会使用Werkzeug 内置的stat 重载器,它的缺点是耗电较严重, 而且准确性一般。为 了获得更优秀的体验,我们可以安装另一个用于监测文件变动的Python 库Watchdog ,安装后
    Werkzeug 会自动使用它来监测文件变动:
    因为这个包只在开发时才会用到,所以我们在安装命令后添加了一个dev 选项,这用来把 这个包声明为开发依赖。在Pipfile 文件中,这个包会被添加到dev-packages 部分。 不过,如果项目中使用了单独的cs s 或Jav aScript 文件时,那么浏览器可能会缓存这些文 件,从而导致对文件做出的修改不能立刻生效。在浏览器中,我们可以按下Crtl+F5 或Shi 负+F5 执行硬重载( hard reload ) ,即忽略缓存井重载( 刷新)页面。
    在一个新电脑创建运行环境时,使用pipenv install 命令时需要添加额外的一dev, 才会安装dev-packages 部分定义的开发依赖包。

    4. Python Shell

    使用flask shell 命令打开的Python Shell 自动包含程序上下文, 并且已经导入了app 实例。上下文( context )可以理解为环珑。为了正常运行程序,一些操作相关的状态和数据需 要要被临时保存下来, 这些状态和数被统称为上下义。在Flask 中,上下文有两种,分 别为程序上下文和请求上下文。

    5. Flask扩展

    扩展( extension ) 即使用Flask 提供的API 接口 编写的Python 库,可以为Flask 程序添加各种各样的功能。大部分Flask 扩展用来集成其他库, 作为Flask 和其他库之间的薄薄一层胶水。
    大部分扩展都会提供一个扩展类,实例化这个类,并传入我们创建的程序实例app 作为参数,即可完成初始化过程。通常,扩展会在传入的程序实例上注册一些处理函数, 并加 载一些配置。 以某扩展实现了Foo 功能为例,这个扩展的名称将是Flask- Foo 或Foo-Flask ;程序包或模 块的命名使用小写加下划线,即flask foo ( 即导人时的名称) ;用于初始化的类一般为Foo ,实 例化的类实例一般使用小写,即foo 。初始化这个假想中的F lask-Foo 扩展的示例如下所示:
    image.png

    6. 项目配置

    在一个项目中,你会用到许多配置: Flask 提供的配置, 扩展提供的配置,还有程序特定的 配置。和平时使用变量不同,这些配置变量都通过Flask 对象的app. co nfig 属性作为统一的接 口来设置和获取,它指向的Config 类实际上是字典的子类,所以你可以像操作其他字典一样操 作它。
    Flask 提供了很多种方式来加载配置。比如,你可以像在字典中添加一个键值对一样来设置 一个配置:
    app .config [ ‘ADMIN _NAME’ ] =’Peter’

    7. URL与端点

    路由的端点即视图函数的名称index ,调用url_for(‘index')即可获取对应的URL。

    8. Flask命令

    image.png

    9. 模板与静态文件

    模板即包含程序页面的HTML 文件,静态文件则 是需要在HTML 文件中加载的css 和JavaScript 文件,以及图片、字体文件等资源文件。
    模板文件存放在项目根目录中的templates 文件夹中,静态文件存放在static 文件夹下, 这两个文件夹需要和包含程序实例的模块处于同一个目录下。
    image.png

    10. Flask与MVC架构

    MVC 架构最初是用来设计桌面程序的,后来也被用于Web 程序,应用了这种架构的Web 框架有Django 、Ruby on Rails 等。在MVC 架构中,程序被分为三个组件:数据处理( Model )、 用户界面( View )、交互逻辑( Controller ) 。如果套用MVC 架构的内容, 那么Flask 中视图函数 的名称其实并不严谨,使用控制器函数( Controller Function )似乎更合适些,虽然它也附带处 理用户界面。严格来说, Flask 并不是MVC 架构的框架,因为它没有内置数据模型支持。
    image.png