Skip to content

flask ​

flask

Flask 诞生于 2010 年,是 Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的 轻量级 Web 开发框架。

Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展 Flask-Mail,用户认证 Flask-Login,数据库 Flask-SQLAlchemy ),都需要用第三方的扩展来实现。比如可以用 Flask 扩展加入 ORM、JWT、文件上传、身份验证等。 Flask 没有默认使用的数据库,你可以选择 MySQL,也可以用 NoSQL。

其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是 Flask 框架的核心。

flask 介绍 ​

1、学习 Flask 框架的原因

Flask 与 Django 为 Python Web 开发使用最主要的两个框架。

2、框架对比

1)框架轻重

重量级的框架:为方便业务程序的开发,提供了丰富的工具、组件,如 Django

轻量级的框架:只提供 Web 框架的核心功能,自由、灵活、高度定制,如 Flask、Tornado

2)与 Django 对比

django 提供了:

  • django-admin 快速创建项目工程目录
  • manage.py 管理项目工程
  • orm 模型(数据库抽象层)
  • admin 后台管理站点
  • 缓存机制
  • 文件存储系统
  • 用户认证系统

而这些,flask 都没有,都需要扩展包来提供

flask 与 Django 对比:

https://www.bilibili.com/read/cv15823286/

3、常用扩展包

  • Flask-SQLAlchemy:操作数据库;
  • Flask-migrate:管理迁移数据库;
  • Flask-jwt-extended:用于管理 jwt token;

4、Flask 文档

  1. 中文文档:https://dormousehole.readthedocs.io/en/latest/
  2. 英文文档:https://flask.palletsprojects.com/en/3.0.x/

提示

flask 除了框架使用起来方便之外,最大的贡献就是提供了一种微框架的思维,给众多的框架在设计时带来了灵感,包括但不限于 fastapi、Sanic 等。 会了 flask 之后再去学习其他 web 框架时上手也会很块,如果该框架借鉴了微框架的思维,那在使用时很多东西都是差不多的。

虚拟环境 ​

为什么要用虚拟环境?

在实际项目开发中,我们通常会根据自己的需求去下载各种相应的框架库,如 flask、requests 等,但是可能每个项目使用的框架库并不一样,或使用框架的版本不一样,这样需要我们根据需求不断的更新或卸载相应的库。直接怼我们的 Python 环境操作会让我们的开发环境和项目造成很多不必要的麻烦,管理也相当混乱。

场景 1:

  • 项目 A 需要 flask 框架 1.0 版本
  • 项目 B 需要 flask 的 2.0 版本。
  • 如果没有安装虚拟环境,那么当你使用这两个项目时,你就需要来回的卸载安装了,这样很容易就给你的项目带来莫名的错误;

venv1

场景 2:

  • 公司之前的项目需要 Python2.7 环境下运行
  • 而你接手的项目需要在 Python3 环境中运行
  • 想想就应该知道,如果不使用虚拟环境,这这两个项目可能无法同时使用,使用 Python3 则公司之前的项目可能无法运行,反正则新项目运行有麻烦。而如果虚拟环境可以分别为这两个项目配置不同的运行环境,这样两个项目就可以同时运行。

venv1

什么是虚拟环境

在 Python 中,虚拟环境(virtual enviroment)就是隔离的 Python 解释器环境。通过创建虚拟环境,可以拥有一个独立的 Python 解释器环境。

这样做的好处是可以为每一个项目创建独立的 Python 解释器环境,因为不同 的项目常常会依赖不同版本的库或 Python 版本。

使用虚拟环境可以保持全 局 Python 解释器环境的⼲净,避免包和版本的混乱,并且可以方便地区分和记录每个项目的依赖,以便在新环境下复现依赖环境。

venv(官方内置) ​

Python3 自带了 venv,而且可以直接代替 Virtualenv。venv 是基于 pip 的 Python 包管理工具,它让包 安装、包依赖管理和虚拟环境管理更加方便,使用它可以实现高效的 Python 项目开发工作流。

创建虚拟环境

首先,我们先在某个目录下(最后是根目录或者是桌面,关键是下次要用能够找得到),输入:

shell
python -m venv XXX

这会为当前项目创建一个文件夹,其中包含隔离的 Python 解释器环 境,并且安装 pip、wheel、setuptools 等基本的包。

激活虚拟环境

之后只需要运行这个里面的 activate 文件就行。Linux 下的命令如下:

shell
source <XXX>/bin/activate

Windows 的 cmd 下是:

shell
C:> <XXX>/Scripts/activate.bat

在 PowerShell 下是:

shell
PS C:> <venv>/Scripts/Activate.bat

但是为了避免运行不信任的脚本,PowerShell 下此脚本可能被禁止。此时输入命令:

shell
set-executionpolicy remotesigned

然后更改执行策略就可以了。

退出环境之前输入:

shell
deactivate

Poetry ​

poetry 是第三方的虚拟环境管理包,也是目前主流的虚拟环境解决方案之一。

参考文档:https://notes.zhengxinonly.com/environment/use-poetry.html

安装 Flask ​

使用 flask 2.x 版本已经不推荐使用了,有兼容性问题。flask 3.x 使用是对一些老旧插件也有兼容性问题。

配置 poetry 在当前项目目录下生成虚拟环境

shell
poetry config virtualenvs.in-project true

下面使用 pip install 命令在我们刚刚创建的虚拟环境里安装 Flask:

shell
poetry add flask==3.0.0

集成开发环境 ​

如果你还没有顺手的文本编辑器,那么可以尝试一下 IDE(Integrated Development Enviroment,集成开发环境)。对于新手来说,IDE 的强大和 完善会帮助你高效开发 Flask 程序,等到你熟悉了整个开发流程,可以换用 更加轻量的编辑器以避免过度依赖 IDE。下面我们将介绍使用 PyCharm 开发 Flask 程序的主要准备步骤。

下载并安装 PyCharm ​

打开 PyCharm 的下载页面(http://jetbrains.com/pycharm/download/ ),单击你使用的操作系统选项卡,然后单击下载按钮。你可以选择试用专业版(Professional Edition),或是选择免费的社区版(Community Edition)。

专业版有一个⽉的免费试用时间。如果你是学生,可以申请专业版的免费授权。专业版提供了更多针对 Flask 开发的功能,比如创建 Flask 项目模板,Jinja2 语法高亮,与 Flask 命令行功能集成等。做项目开发,比较推荐使用专业版。

创建项目 ​

安装成功后,初始界面提供了多种方式创建新项目。这里可以单 击“Open”,选择我们的 flask-demo 文件夹即可。

设置 Python 解释器 ​

单击菜单栏中的 File → Settings 打开设置,设置项目的解释器。

Pycharm 启动项目 ​

右上角配置启动项目

注意

如果需要进入调试模式,Pycharm 安装路径中不能有中文、空白字符。

命令行启动 ​

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

运行 flask ​

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

shell
(venv)$ flask run
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

确保执行命令前激活了虚拟环境(virtualenv shell)

flask run 命令运行的开发服务器默认会监听 http://127.0.0.1:5000/ 地址 (按 Ctrl + C 退出),并开启多线程⽀持。当我们打开浏览器访问这个地址时,会看到⽹页上显示 Hello flask!,如图所示。

localhost 与 127.0.0.1

  • http://127.0.0.1 即 localhost ,是指向本地机的 IP 地址,一般用来测试。
  • Flask 默认使用 5000 端口,上面的地址可以使用 http://localhost:5000/ 。
  • 除了地址不同外,两者没有实际区别,即域名和 IP 地址的映射关系。

最小的 Flask 程序 ​

python
from flask import Flask  # ⑴

app = Flask(__name__)  # ⑵


@app.route('/')  # ⑶
def index():  # ⑷
    return 'Hello flask !'  # ⑸


if __name__ == '__main__':
    app.run()  # ⑹

启动服务之后,就可以在浏览器中访问了。整个请求的处理过程如下所示:

  1. 当用户在浏览器地址栏访问这个地址,在这里即 http://127.0.0.1:5000/
  2. 服务器解析请求,发现请求 URL 匹配的 URL 规则是 /,因此调用对应的处理函数 index()
  3. 获取 index() 函数的返回值,处理后返回给客户端(浏览器)
  4. 浏览器接受响应,将其显示在窗口上

代码逻辑 ​

⑴ 首先我们从 flask 包导入 Flask 类

python
from flask import Flask  # ⑴

⑵ 通过实例化这个类,创建一个程序对象 app:

python
app = Flask(__name__)  # ⑵

⑶ 使用 app.route() 装饰器将函数绑定对应的 URL,当用户在浏览器访问这个 URL 的时候,就会触发这个函数,获取返回值,并把返回值显示到浏览器窗口。

⑷ 装饰器注册的处理函数,这个函数是处理某个请求的处理函数,Flask 官方把它叫做视图函数(view function)!你可以理解为请求处理函数。

⑸ 返回响应内容

python
# 填入 app.route() 装饰器的第一个参数是 URL 规则字符串,这里的 / 指的是根地址。
@app.route('/')  # ⑶
def index():  # ⑷
    return 'Hello flask !'  # ⑸

⑹ Flask 应用程序实例的 run 方法启动 WEB 服务器

python
if __name__ == '__main__':
    app.run()  # ⑹

更多的启动选项 ​

使服务器外部可见 ​

我们在上面启动的 Web 服务器默认是对外不可见的,可以在 run 命令后 添加 --host 选项将主机地址设为 0.0.0.0 使其对外可见:

shell
flask run --host=0.0.0.0

这会让服务器监听所有外部请求。个人计算机(主机)一般没有公⽹ IP(公有地址),所以你的程序只能被局域⽹内的其他用户通过你的个人 计算机的内⽹ IP(私有地址)访问,比如你的内⽹ IP 为 192.168.191.1。当局域⽹内的其他用户访问 http://192.168.191.1:5000 时,也会看到浏览器里 显示一行Hello Flask !。

改变默认端口 ​

Flask 提供的 Web 服务器默认监听 5000 端口,你可以在启动时传入参数来改变它:

shell
flask run --port=8000

这时服务器会监听来自 8000 端口的请求,程序的主页地址也相应变成 了 http://localhost:8000/ 。

将参数保存到文件 ​

需要提前安装 python-dotenv

shell
pip install python-dotenv

执行 flask run 命令时的 host 和 port 选项也可以通过环境变量 FLASK*RUN_HOST 和 FLASK_RUN_PORT 设置。事实上,Flask 内置的命令都可以使用这种模式定义默认选项值,即 FLASK*<COMMAND>\_<OPTION>

如果想不需要每次都指定,可以内容保存到当前目录下的 .flaskenv 或者是 .env 文件中(需要安装 python-dotenv )。

shell
FLASK_DEBUG=True
FLASK_ENV=development		# 设置当前开发模式
FLASK_RUN_PORT=5050			# 设置运行的端口
FLASK_RUN_HOST=0.0.0.0		# 设置监听的 ip
FLASK_APP=app.py

源于配置参数,可以点击此链接查看 https://flask.palletsprojects.com/en/latest/cli/

也可以使用 flask --help 命令查看所有可用的命令。

设置运行环境 ​

开发环境(development environment)和生产环境(production environment)是我们后面会频繁接触到的概念。开发环境是指我们在本地 编写和测试程序时的计算机环境,而生产环境与开发环境相对,它指的是 ⽹站部署上线供用户访问时的服务器环境

根据运行环境的不同,Flask 程序、扩展以及其他程序会改变相应的行 为和设置。为了区分程序运行环境,Flask 提供了一个 FLASK_ENV 环境变 量用来设置环境,默认为 production(生产)。在开发时,我们可以将其设 为 development(开发),这会开启所有⽀持开发的特性。为了方便管理, 我们将把环境变量 FLASK_ENV 的值写入 .flaskenv 文件中:

shell
FLASK_ENV=development

现在启动程序,你会看到下面的输出提示:

shell
(helloflask) $ flask run
 * Environment: development
 * Debug mode: on
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 161-372-375
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

flask Shell ​

本书有许多操作需要在 Python Shell(即 Python 交互式解释器)里执 行。在开发 Flask 程序时,我们并不会直接使用 python 命令启动 Python Shell,而是使用 flask shell 命令:

shell
flask shell

和其他 flask 命令相同,执行这个命令前我们要确保程序实例可以被正常找到。

在后续代码中,如果代码片段前的提示符为三个大于号,即 >>> ,那么就表示这些代码需要在使用 flask shell 命令打开的 Python Shell 中执行。

使用 flask shell 命令打开的 Python Shell 自动包含程序上下文,并且已经导入了 app 实例:

python
>>> app
<Flask 'app'>
>>> app.name
'app'
>>>

上下文(context)可以理解为环境。为了正常运行程序,一些操作相关的状态和数据需要被临时保存下来,这些状态和数据被统称为上下文。在 Flask 中,上下文有两种,分别为程序上下文和请求上下文,后面我们会详细了解。