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 文档
提示
flask 除了框架使用起来方便之外,最大的贡献就是提供了一种微框架的思维,给众多的框架在设计时带来了灵感,包括但不限于 fastapi、Sanic 等。 会了 flask 之后再去学习其他 web 框架时上手也会很块,如果该框架借鉴了微框架的思维,那在使用时很多东西都是差不多的。
虚拟环境
为什么要用虚拟环境?
在实际项目开发中,我们通常会根据自己的需求去下载各种相应的框架库,如 flask、requests 等,但是可能每个项目使用的框架库并不一样,或使用框架的版本不一样,这样需要我们根据需求不断的更新或卸载相应的库。直接怼我们的 Python 环境操作会让我们的开发环境和项目造成很多不必要的麻烦,管理也相当混乱。
场景1:
- 项目 A 需要 flask 框架 1.0 版本
- 项目 B 需要 flask 的 2.0 版本。
- 如果没有安装虚拟环境,那么当你使用这两个项目时,你就需要来回的卸载安装了,这样很容易就给你的项目带来莫名的错误;
场景2:
- 公司之前的项目需要 Python2.7 环境下运行
- 而你接手的项目需要在 Python3 环境中运行
- 想想就应该知道,如果不使用虚拟环境,这这两个项目可能无法同时使用,使用 Python3 则公司之前的项目可能无法运行,反正则新项目运行有麻烦。而如果虚拟环境可以分别为这两个项目配置不同的运行环境,这样两个项目就可以同时运行。
什么是虚拟环境
在 Python 中,虚拟环境(virtual enviroment)就是隔离的 Python 解释器环境。通过创建虚拟环境,可以拥有一个独立的 Python 解释器环境。
这样做的好处是可以为每一个项目创建独立的 Python 解释器环境,因为不同 的项目常常会依赖不同版本的库或 Python 版本。
使用虚拟环境可以保持全 局 Python 解释器环境的⼲净,避免包和版本的混乱,并且可以方便地区分和记录每个项目的依赖,以便在新环境下复现依赖环境。
venv(官方内置)
Python3 自带了 venv,而且可以直接代替 Virtualenv。venv 是基于 pip 的 Python 包管理工具,它让包 安装、包依赖管理和虚拟环境管理更加方便,使用它可以实现高效的 Python 项目开发工作流。
创建虚拟环境
首先,我们先在某个目录下(最后是根目录或者是桌面,关键是下次要用能够找得到),输入:
python -m venv XXX
这会为当前项目创建一个文件夹,其中包含隔离的Python解释器环 境,并且安装pip、wheel、setuptools等基本的包。
激活虚拟环境
之后只需要运行这个里面的activate文件就行。Linux下的命令如下:
source <XXX>/bin/activate
Windows 的 cmd 下是:
C:> <XXX>/Scripts/activate.bat
在PowerShell下是:
PS C:> <venv>/Scripts/Activate.bat
但是为了避免运行不信任的脚本,PowerShell下此脚本可能被禁止。此时输入命令:
set-executionpolicy remotesigned
然后更改执行策略就可以了。
退出环境之前输入:
deactivate
Poetry
poetry 是第三方的虚拟环境管理包,也是目前主流的虚拟环境解决方案之一。
参考文档: https://notes.zhengxinonly.com/environment/use-poetry.html
安装 Flask
使用 flask 2.x 版本已经不推荐使用了,有兼容性问题。flask 3.x 使用是对一些老旧插件也有兼容性问题。
配置 poetry 在当前项目目录下生成虚拟环境
poetry config virtualenvs.in-project true
下面使用 pip install 命令在我们刚刚创建的虚拟环境里安装 Flask:
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 命令用来启动内置的开发服务器:
(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 程序
from flask import Flask # ⑴
app = Flask(__name__) # ⑵
@app.route('/') # ⑶
def index(): # ⑷
return 'Hello flask !' # ⑸
if __name__ == '__main__':
app.run() # ⑹
启动服务之后,就可以在浏览器中访问了。整个请求的处理过程如下所示:
- 当用户在浏览器地址栏访问这个地址,在这里即
http://127.0.0.1:5000/
- 服务器解析请求,发现请求 URL 匹配的 URL 规则是
/
,因此调用对应的处理函数index()
- 获取
index()
函数的返回值,处理后返回给客户端(浏览器) - 浏览器接受响应,将其显示在窗口上
代码逻辑
⑴ 首先我们从 flask
包导入 Flask
类
from flask import Flask # ⑴
⑵ 通过实例化这个类,创建一个程序对象 app
:
app = Flask(__name__) # ⑵
⑶ 使用 app.route()
装饰器将函数绑定对应的 URL,当用户在浏览器访问这个 URL 的时候,就会触发这个函数,获取返回值,并把返回值显示到浏览器窗口。
⑷ 装饰器注册的处理函数,这个函数是处理某个请求的处理函数,Flask 官方把它叫做视图函数(view function)!你可以理解为请求处理函数。
⑸ 返回响应内容
# 填入 app.route() 装饰器的第一个参数是 URL 规则字符串,这里的 / 指的是根地址。
@app.route('/') # ⑶
def index(): # ⑷
return 'Hello flask !' # ⑸
⑹ Flask 应用程序实例的 run 方法启动 WEB 服务器
if __name__ == '__main__':
app.run() # ⑹
更多的启动选项
使服务器外部可见
我们在上面启动的 Web 服务器默认是对外不可见的,可以在 run 命令后 添加 --host
选项将主机地址设为 0.0.0.0
使其对外可见:
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 端口,你可以在启动时传入参数来改变它:
flask run --port=8000
这时服务器会监听来自 8000 端口的请求,程序的主页地址也相应变成 了 http://localhost:8000/
。
将参数保存到文件
需要提前安装 python-dotenv
pip install python-dotenv
执行 flask run 命令时的 host 和 port 选项也可以通过环境变量 FLASK_RUN_HOST 和 FLASK_RUN_PORT 设置。事实上,Flask内置的命令都可以使用这种模式定义默认选项值, 即 FLASK_<COMMAND>_<OPTION>
如果想不需要每次都指定,可以内容保存到当前目录下的 .flaskenv
或者是 .env
文件中(需要安装 python-dotenv
)。
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
文件中:
FLASK_ENV=development
现在启动程序,你会看到下面的输出提示:
(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 命令:
flask shell
和其他 flask 命令相同,执行这个命令前我们要确保程序实例可以被正常找到。
在后续代码中,如果代码片段前的提示符为三个大于号,即 >>>
,那么就表示这些代码需要在使用 flask shell 命令打开的 Python Shell 中执行。
使用 flask shell 命令打开的 Python Shell 自动包含程序上下文,并且已经导入了 app 实例:
>>> app
<Flask 'app'>
>>> app.name
'app'
>>>
上下文(context)可以理解为环境。为了正常运行程序,一些操作相关的状态和数据需要被临时保存下来,这些状态和数据被统称为上下文。在 Flask 中,上下文有两种,分别为程序上下文和请求上下文,后面我们会详细了解。