1 简介
Flask诞生于2010年,是其作者Armin Ronacher的一个愚人节玩笑。Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。Flask也被称为 『微框架(Micro-Framework)』,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。主要面向需求简单,项目周期短的小应用。
2 组件
2.1 内置组件
安装 Flask 时,以下配套软件会被自动安装。
- Werkzeug 用于实现 WSGI (Web Service Gateway Interface) Web服务器网关接口,是应用和服务之间的标准 Python 接口。
- Jinja 用于渲染页面的模板语言。
- MarkupSafe 与 Jinja 共用,在渲染页面时用于避免不可信的输入,防止注入攻击。
- ItsDangerous 保证数据完整性的安全标志数据,用于保护 Flask 的 session cookie.
- Click 是一个命令行应用的框架。用于提供 flask 命令,并允许添加自定义 管理命令。
2.2 可选套件
以下配套软件不会被自动安装。如果安装了,那么 Flask 会检测到这些软件。
- Blinker 为 信号 提供支持。
- SimpleJSON 是一个快速的 JSON 实现,兼容 Python’s json 模块。如果安装 了这个软件,那么会优先使用这个软件来进行 JSON 操作。
- python-dotenv 当运行 flask 命令时为 通过 dotenv 设置环境变量 提供支持。
- Watchdog 为开发服务器提供快速高效的重载。
3 安装
3.1 Python
推荐使用最新版本的 Python 3.x,可参考本文。
3.2 虚拟环境virtualenv
为什么要使用虚拟环境?随着你的 Python 项目越来越多,你会发现不同的项目会需要不同的版本的 Python 库。同一个 Python 库的不同版本可能不兼容。而虚拟环境虽然并没有安装独立的 Python 副本,但是它提供了一种巧妙的方式来来让各项目环境保持独立。这样就可以隔离不同项目之间的 Python 库,也可以隔离项目与操作系统之间的 Python 库。建议在开发环境和生产环境下都使用虚拟环境来管理项目的依赖。
安装命令
sudo easy_install virtualenv
sudo pip3 install virtualenv
sudo apt-get install python-virtualenv # Ubuntu
3.2.1 创建虚拟环境
mkdir projectTest
cd projectTest
python3 -m venv venv
此时,可以看到 projectTest 目录下多了一个 venv 目录,其内部的结构如下:
./
├── bin
│ ├── Activate.ps1
│ ├── activate
│ ├── activate.csh
│ ├── activate.fish
│ ├── easy_install
│ ├── easy_install-3.8
│ ├── flask
│ ├── pip
│ ├── pip3
│ ├── pip3.8
│ ├── python -> python3
│ └── python3 -> /usr/local/bin/python3
├── include
├── lib
│ └── python3.8
└── pyvenv.cfg
3.2.2 激活虚拟环境
在 projectTest 目录中,执行命令
. venv/bin/activate
激活后,你的终端提示符会显示虚拟环境的名称。
(venv) appledeMacBook-Pro:projectTest c80k2$
3.3 安装Flask
sudo pip3 install Flask
输出
pip3 install Flask
Collecting Flask
Downloading Flask-1.1.2-py2.py3-none-any.whl (94 kB)
|████████████████████████████████| 94 kB 1.7 MB/s
Collecting Jinja2>=2.10.1
Downloading Jinja2-2.11.3-py2.py3-none-any.whl (125 kB)
|████████████████████████████████| 125 kB 5.6 MB/s
Collecting itsdangerous>=0.24
Downloading itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB)
Collecting click>=5.1
Downloading click-7.1.2-py2.py3-none-any.whl (82 kB)
|████████████████████████████████| 82 kB 2.1 MB/s
Collecting Werkzeug>=0.15
Downloading Werkzeug-1.0.1-py2.py3-none-any.whl (298 kB)
|████████████████████████████████| 298 kB 2.6 MB/s
Collecting MarkupSafe>=0.23
Downloading MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl (16 kB)
Installing collected packages: MarkupSafe, Jinja2, itsdangerous, click, Werkzeug, Flask
Successfully installed Flask-1.1.2 Jinja2-2.11.3 MarkupSafe-1.1.1 Werkzeug-1.0.1 click-7.1.2 itsdangerous-1.1.0
WARNING: You are using pip version 20.1.1; however, version 21.0.1 is available.
You should consider upgrading via the '/Users/yiyunjie/Desktop/flaskTest/venv/bin/python3 -m pip install --upgrade pip' command.
4 入门
4.1 创建python文件
在projectTest目录中创建一个python文件,例如 hello.py (注意不要使用 flask.py
作为应用名称,这会与 Flask 本身发生冲突)。
写入内容:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
#app.run(host='0.0.0.0', port=8080, DEBUG=Ture)
我们来分别解释一下:
- 第一行导入了Flask类,以便创建一个Flask类的实例;
- 第二行创建了一个Flask类的实例。这是一个WSGI应用实例。WSGI (Web Service Gateway Interface) 就是 Web服务器网关接口,同时也是架设web项目的Python标准。它的一个参数是应用模块或者包的名称,如果你使用 一个单一模块(就像本例),那么应当使用 __name__ ,让Flask在当前模块内寻找模板和静态文件等资源;
- 第三行使用 route() 装饰器来告诉 Flask 触发函数的 URL;
- 最后用 run() 函数来让应用运行在本地服务器上。 其中
if __name__ == '__main__'
: 确保服务器只会在该脚本被 Python 解释器直接执行的时候才会运行,而不是作为模块导入的时候。 - 注意最后一行被注释的部分,这里可以填写当前应用所运行的host和port,以及是否为Debug状态。默认是 127.0.0.1:5050,如果是 0.0.0.0 则表示监听所有IP过来的请求。
4.2 执行
执行
export FLASK_ENV=development # 打开所有开发功能,开启调试模式,激活自动重载,可不使用
export FLASK_APP=hello.py
flask run
flask run --host=0.0.0.0 --port=8080 --debug=true
输出
* Serving Flask app "hello.py"
* 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)
此时,Flask应用就运行在 127.0.0.1:5000 上面
我们在本机的浏览器上,输入地址,回车,就出现代码所返回的 Hello World! 了
而命令行中,也出现以下记录:
127.0.0.1 - - [12/Mar/2021 20:53:11] "GET / HTTP/1.1" 200 -