认识Flask ------ 知识点详解
一、Flask简介
1. Flask是什么
- Flask 是一个使用 Python 编写的轻量级 Web 应用框架(microframework)。
- 它由 Armin Ronacher 开发,基于 Werkzeug WSGI 工具库 和 Jinja2 模板引擎 构建。
- Flask 属于"微框架"(micro-framework),这里的"微"指的是核心功能精简,而非功能弱小。它只保留核心功能(路由、请求/响应处理、模板渲染),其余功能通过扩展(Extension) 实现。
2. Flask 的特点
| 特点 | 说明 |
|---|---|
| 轻量简洁 | 核心代码量少,没有强制的项目结构和依赖 |
| 灵活自由 | 不强制使用特定的数据库、表单验证库等,开发者可自由选型 |
| 易于上手 | 几行代码即可启动一个 Web 服务 |
| 扩展丰富 | 拥有庞大的第三方扩展生态(Flask-SQLAlchemy、Flask-Login、Flask-RESTful 等) |
| Werkzeug 与 Jinja2 | 底层依赖两个成熟的库,稳定可靠 |
| 内置开发服务器和调试器 | 开发阶段可以快速定位错误 |
| 支持 RESTful API | 天然适合构建 API 服务 |
| 社区活跃 | 文档完善,社区资源丰富 |
3. Flask 与其他框架的对比
| 对比项 | Flask | Django |
|---|---|---|
| 定位 | 微框架,轻量灵活 | 全功能框架(Full-Stack) |
| 自带组件 | 仅核心路由和模板 | ORM、Admin、Auth、Session 等全家桶 |
| 项目结构 | 无强制目录结构 | 约定式目录结构(app + project) |
| 学习曲线 | 较低 | 较高 |
| 适用场景 | 小型项目、API 服务、原型开发、微服务 | 大型复杂项目、内容管理系统 |
| 数据库 | 需借助扩展(如 Flask-SQLAlchemy) | 内置 Django ORM |
| URL 路由 | 装饰器方式(@app.route) |
URLconf 配置文件方式 |
4. WSGI 协议简介
- WSGI (Web Server Gateway Interface,Web 服务器网关接口),是 Python Web 服务器与 Web 应用之间的一种标准接口规范(PEP 3333)。
- Flask 应用本身就是一个 WSGI 应用对象。
- Werkzeug 就是 Flask 底层依赖的 WSGI 工具库,负责处理 HTTP 请求和响应。
- 工作流程:客户端请求 → Web 服务器(如 Nginx)→ WSGI 中间层(如 Gunicorn)→ Flask 应用 → 返回响应。
5. Jinja2 模板引擎简介
- Jinja2 是 Python 中功能强大的模板引擎。
- 在 Flask 中负责将 Python 数据渲染到 HTML 页面中。
- 支持模板继承(
{% extends %})、宏({% macro %})、条件判断({% if %})、循环({% for %})、过滤器(|)等。 - 模板文件默认存放在项目根目录下的
templates/文件夹中。
二、搭建Flask开发环境
1. Python 环境准备
-
Flask 要求 Python 版本 ≥ 3.8(推荐 3.9 及以上)。
-
安装完成后,通过命令行验证:
bashpython --version # 或 python3 --version -
确保 pip 已安装并可正常使用:
bashpip --version pip install --upgrade pip # 建议升级到最新版
三、创建虚拟的Python环境
1. 为什么需要虚拟环境
- 隔离项目依赖:不同项目可能依赖同一个库的不同版本,虚拟环境为每个项目创建独立的 Python 运行环境。
- 避免全局污染:不会影响系统级的 Python 环境和其他项目。
- 便于部署 :可以精确导出项目依赖清单(
requirements.txt),方便在服务器上重现环境。
2. 使用 venv 创建虚拟环境(Python 内置模块)
bash
# 第一步:进入项目目录
mkdir my_flask_project
cd my_flask_project
# 第二步:创建虚拟环境(环境名称通常为 venv 或 .venv)
python -m venv venv
执行后会在项目目录下生成 venv/ 文件夹,其内部结构:
venv/
├── bin/ (Linux/Mac 存放 python、pip、activate 等可执行文件)
├── Scripts/ (Windows 存放 python.exe、pip.exe、activate.bat 等)
├── include/
├── lib/ (安装的第三方包存放在此)
└── pyvenv.cfg (虚拟环境的配置文件)
3. 激活虚拟环境
Windows(CMD):
bash
venv\Scripts\activate
Windows(PowerShell):
bash
venv\Scripts\Activate.ps1
# 若遇到执行策略限制,需先执行:
# Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Linux / macOS:
bash
source venv/bin/activate
激活成功后,命令行提示符前会出现 (venv) 标识,表示当前处于虚拟环境中。
4. 退出虚拟环境
bash
deactivate
5. 使用 virtualenv(第三方工具,功能更丰富)
bash
pip install virtualenv
virtualenv venv # 创建
virtualenv venv --python=python3.11 # 指定 Python 版本
6. 使用 conda 创建虚拟环境(Anaconda/Miniconda)
bash
conda create -n flask_env python=3.11
conda activate flask_env
conda deactivate
四、安装Flask
1. 在激活虚拟环境后安装
bash
pip install Flask
该命令会自动安装 Flask 及其依赖包:
- Werkzeug:WSGI 工具库
- Jinja2:模板引擎
- itsdangerous:数据签名(用于 Session 等)
- click:命令行工具
- MarkupSafe:HTML 转义
- blinker:信号支持
2. 验证安装
bash
# 方式一:查看版本
python -c "import flask; print(flask.__version__)"
# 方式二:查看 pip 列表
pip show Flask
# 方式三:查看所有已安装的包
pip list
3. 指定版本安装
bash
pip install Flask==2.3.3 # 安装指定版本
pip install 'Flask>=2.2,<3.0' # 安装版本范围
4. 使用 requirements.txt 管理依赖
bash
# 导出当前环境所有依赖
pip freeze > requirements.txt
# 从文件安装依赖(在新环境中重现环境)
pip install -r requirements.txt
requirements.txt 示例:
Flask==3.0.0
Werkzeug==3.0.1
Jinja2==3.1.2
itsdangerous==2.1.2
五、安装PyCharm
1. PyCharm 简介
- PyCharm 是 JetBrains 公司开发的专业 Python IDE(集成开发环境)。
- 版本分类:
- Community Edition(社区版):免费开源,支持纯 Python 开发。
- Professional Edition(专业版):付费,额外支持 Web 开发(Flask、Django)、数据库工具、远程开发等。
- Flask 开发使用社区版即可满足基本需求。
2. 下载与安装
- 访问官网:https://www.jetbrains.com/pycharm/
- 根据操作系统下载对应安装包(Windows / macOS / Linux)。
- 安装时建议勾选:
- 创建桌面快捷方式
- 关联
.py文件 - 添加到系统 PATH(可选)
- 首次启动后选择主题风格(Darcula 暗色 / Light 亮色)和安装常用插件。
3. PyCharm 常用快捷键(Windows/Linux)
| 功能 | 快捷键 |
|---|---|
| 运行程序 | Shift + F10 |
| 调试程序 | Shift + F9 |
| 查找/替换 | Ctrl + F / Ctrl + H |
| 格式化代码 | Ctrl + Alt + L |
| 注释/取消注释 | Ctrl + / |
| 重构/重命名 | Shift + F6 |
| 快速查看文档 | Ctrl + Q |
| 查看定义 | Ctrl + B |
| 全局搜索 | 双击 Shift |
六、在PyCharm中配置虚拟环境
1. 创建新项目时配置
- 打开 PyCharm → New Project。
- 展开 Python Interpreter 选项。
- 选择 New environment using → Virtualenv。
- 设置:
- Location :虚拟环境存放路径(默认在项目目录下创建
venv)。 - Base interpreter:选择系统中已安装的 Python 解释器版本。
- Inherit global site-packages:是否继承全局已安装的包(通常不勾选,保持隔离)。
- Make available to all projects:是否让其他项目也能使用此环境(通常不勾选)。
- Location :虚拟环境存放路径(默认在项目目录下创建
- 点击 Create 完成。
2. 为已有项目配置虚拟环境
- 打开 PyCharm → File → Settings (macOS 为 PyCharm → Preferences)。
- 进入 Project: 项目名 → Python Interpreter。
- 点击右上角齿轮图标 → Add Interpreter → Add Local Interpreter。
- 选择 Virtualenv Environment :
- Existing :选择已有的虚拟环境路径(找到
venv/bin/python或venv\Scripts\python.exe)。 - New:创建新的虚拟环境。
- Existing :选择已有的虚拟环境路径(找到
- 点击 OK 确认。
3. 验证配置是否成功
- 在 PyCharm 底部 Terminal 面板中,提示符前应显示
(venv)。 - 在 Terminal 中执行
pip list,确认 Flask 已在列表中。 - 创建 Python 文件,写入
import flask不报错即说明配置成功。
七、开发第一个Flask程序
1. 编写 Hello Flask 程序
创建文件 app.py(或 hello.py):
python
# 1. 从 flask 包中导入 Flask 类
from flask import Flask
# 2. 创建 Flask 应用实例
# __name__ 表示当前模块名,Flask 用它来确定资源路径
app = Flask(__name__)
# 3. 使用路由装饰器绑定 URL 与视图函数
@app.route('/')
def hello():
return '<h1>Hello Flask!</h1>'
# 4. 启动开发服务器
if __name__ == '__main__':
app.run()
2. 运行方式
方式一:命令行运行
bash
python app.py
方式二:使用 flask run 命令
bash
# 设置环境变量(告诉 Flask 应用入口在哪里)
# Windows CMD:
set FLASK_APP=app.py
# Linux/macOS:
export FLASK_APP=app.py
flask run
方式三:PyCharm 中直接运行
- 右键点击文件 → Run 'app'
- 或点击
app.py中的绿色三角按钮
3. 运行成功后的输出
* Serving Flask app 'app'
* Debug mode: off
* Running on http://127.0.0.1:5000
在浏览器中访问 http://127.0.0.1:5000 即可看到页面显示 Hello Flask!。
八、程序的基本结构
1. 最简结构(单文件)
python
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello'
if __name__ == '__main__':
app.run(debug=True)
2. 各部分详解
(1)导入 Flask 类
python
from flask import Flask
Flask类是整个框架的核心,所有的 Web 应用都是从创建这个类的实例开始。- 也可以用
import flask,但通常只导入Flask类即可。
(2)创建应用实例
python
app = Flask(__name__)
__name__参数的作用 :- Flask 用它来决定静态文件 和模板文件的查找路径。
- 如果传入的是
"__main__"(直接运行当前文件),Flask 以当前文件所在目录为根目录。 - 如果传入的是模块名(被其他模块导入时),Flask 会到该模块对应的包目录下查找资源。
- 也可以显式指定路径:
Flask(__name__, static_folder='static', template_folder='templates')
(3)路由(Route)和视图函数(View Function)
python
@app.route('/')
def index():
return 'Hello'
-
路由:将一个 URL 映射到一个 Python 函数(即视图函数)。
-
@app.route('/')是装饰器,'/'是 URL 路径。 -
当用户访问
http://127.0.0.1:5000/时,Flask 会调用index()函数,返回值作为响应内容。 -
一个视图函数可以绑定多个路由:
python@app.route('/') @app.route('/index') def index(): return 'Index Page'
(4)变量规则(动态路由)
python
@app.route('/user/<username>')
def show_user(username):
return f'User: {username}'
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'Post ID: {post_id}'
支持的转换器类型:
| 转换器 | 说明 | 示例 |
|---|---|---|
<string:name> |
默认,接受不带斜杠的字符串 | /user/john |
<int:id> |
接受正整数 | /post/42 |
<float:price> |
接受正浮点数 | /price/9.99 |
<path:filepath> |
接受包含斜杠的路径 | /files/a/b/c.txt |
<uuid:id> |
接受 UUID 格式的字符串 | /user/123e4567-... |
(5)启动开发服务器
python
if __name__ == '__main__':
app.run(debug=True)
if __name__ == '__main__':只有直接运行该脚本时才启动服务器,被其他模块导入时不执行。app.run()的常用参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
host |
str | '127.0.0.1' |
监听地址,'0.0.0.0' 表示对外可访问 |
port |
int | 5000 |
监听端口 |
debug |
bool | False |
是否开启调试模式 |
use_reloader |
bool | True |
代码修改后是否自动重启 |
use_debugger |
bool | True |
是否启用交互式调试器 |
python
app.run(host='0.0.0.0', port=8080, debug=True)
(6)调试模式(Debug Mode)
开启方式:
python
# 方式一:在 run() 中
app.run(debug=True)
# 方式二:设置属性
app.debug = True
# 方式三:环境变量
# export FLASK_DEBUG=1
调试模式的作用:
- 自动重载:代码修改后服务器自动重启,无需手动重启。
- 交互式调试器 :浏览器中出现错误时,可直接在页面上进行代码调试(注意:生产环境严禁开启,存在严重安全风险)。
九、Flask程序配置
1. 配置信息的使用
Flask 应用使用 app.config 属性来管理配置,它本质上是一个字典对象 (继承自 Python 的 dict),支持标准的字典操作。
(1)直接操作字典
python
# 设置单个配置项
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'my-secret-key'
# 获取配置值
debug_status = app.config['DEBUG']
debug_status = app.config.get('DEBUG', False) # 推荐,可设置默认值
(2)使用 from_object() 加载配置类(推荐方式)
创建独立的配置文件 config.py:
python
import os
class Config:
"""基础配置"""
SECRET_KEY = os.environ.get('SECRET_KEY', 'default-secret-key')
SQLALCHEMY_TRACK_MODIFICATIONS = False
class DevelopmentConfig(Config):
"""开发环境配置"""
DEBUG = True
SQLALCHEMY_DATABASE_URI = 'sqlite:///dev.db'
class ProductionConfig(Config):
"""生产环境配置"""
DEBUG = False
SQLALCHEMY_DATABASE_URI = 'mysql://user:pass@localhost/prod_db'
class TestingConfig(Config):
"""测试环境配置"""
TESTING = True
SQLALCHEMY_DATABASE_URI = 'sqlite:///test.db'
# 配置字典,方便根据环境名选择
config = {
'development': DevelopmentConfig,
'production': ProductionConfig,
'testing': TestingConfig,
'default': DevelopmentConfig
}
在应用中加载:
python
app = Flask(__name__)
app.config.from_object('config.DevelopmentConfig')
# 或者通过环境变量动态切换
import os
env = os.environ.get('FLASK_ENV', 'development')
app.config.from_object(config[env])
(3)使用 from_pyfile() 加载 Python 配置文件
创建配置文件 settings.cfg:
python
SECRET_KEY = 'another-secret'
DEBUG = True
DATABASE_URI = 'sqlite:///app.db'
加载方式:
python
app.config.from_pyfile('settings.cfg')
# 也可以使用绝对路径
app.config.from_pyfile('/path/to/settings.cfg', silent=True) # silent=True 文件不存在时不报错
(4)使用 from_json() 加载 JSON 文件
json
{
"SECRET_KEY": "json-secret",
"DEBUG": true
}
python
app.config.from_json('config.json')
(5)使用 from_mapping() 传入字典
python
app.config.from_mapping(
SECRET_KEY='mapping-secret',
DEBUG=True,
DATABASE='sqlite:///app.db'
)
(6)使用环境变量加载(12-Factor App 推荐)
python
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', 'fallback-key')
app.config['DATABASE_URI'] = os.environ.get('DATABASE_URI')
或使用前缀加载所有以 FLASK_ 开头的环境变量:
python
app.config.from_prefixed_env() # Flask 2.0+
# 环境变量 FLASK_SECRET_KEY → app.config['SECRET_KEY']
2. 配置加载的优先级
如果同一个键在多种方式中被设置,后加载的会覆盖先加载的。一般推荐顺序:
环境变量(最高优先级) > from_pyfile / from_json / from_object > 默认值
3. 常用配置项介绍
| 配置项 | 类型 | 说明 |
|---|---|---|
DEBUG |
bool | 是否开启调试模式(默认 False) |
TESTING |
bool | 是否开启测试模式(默认 False) |
SECRET_KEY |
str | 密钥,用于 Session 加密、CSRF 保护、Cookie 签名等,必须设置为复杂随机值 |
JSON_AS_ASCII |
bool | JSON 响应是否使用 ASCII 编码(设为 False 可返回中文) |
JSON_SORT_KEYS |
bool | JSON 输出是否按 key 排序(默认 True) |
JSONIFY_PRETTYPRINT_REGULAR |
bool | JSON 是否格式化输出(调试时有用) |
MAX_CONTENT_LENGTH |
int | 请求体最大字节数(如 16 * 1024 * 1024 表示 16MB) |
TEMPLATES_AUTO_RELOAD |
bool | 模板文件修改后是否自动重新加载 |
EXPLAIN_TEMPLATE_LOADING |
bool | 打印模板加载的详细日志(调试模板路径问题时有用) |
SERVER_NAME |
str | 服务器名称(如 localhost:5000),用于子域名支持 |
APPLICATION_ROOT |
str | 应用的 URL 前缀(如 /myapp) |
SESSION_COOKIE_NAME |
str | Session Cookie 的名称(默认 'session') |
SESSION_COOKIE_HTTPONLY |
bool | Session Cookie 是否仅限 HTTP 访问(默认 True) |
SESSION_COOKIE_SECURE |
bool | Session Cookie 是否仅通过 HTTPS 传输(生产环境应设为 True) |
PERMANENT_SESSION_LIFETIME |
timedelta | 持久 Session 的过期时间(默认 31 天) |
SEND_FILE_MAX_AGE_DEFAULT |
int/timedelta | 静态文件的缓存时间(秒) |
PREFERRED_URL_SCHEME |
str | 生成外部 URL 时的首选协议('http' 或 'https') |
TRAP_HTTP_EXCEPTIONS |
bool | 是否将 HTTP 异常转为通用错误(调试时有用) |
PROPAGATE_EXCEPTIONS |
bool | 是否让异常向上传播到 WSGI 服务器 |
4. 从应用外部访问配置
在视图函数中通过 current_app 代理访问:
python
from flask import current_app
@app.route('/config')
def show_config():
secret = current_app.config['SECRET_KEY']
return f'Secret: {secret}'
5. 配置类命名约定
Flask 配置项名称习惯上使用全大写字母 + 下划线,因为它们实质上是类属性,遵循 Python 常量命名惯例。Flask 内部会自动忽略所有小写开头的属性。
十、Flask扩展包
1. 什么是 Flask 扩展
- Flask 扩展是为 Flask 添加特定功能的第三方包。
- 扩展通常以
Flask-为前缀命名(如Flask-SQLAlchemy)。 - 安装后在代码中通过
from flask_xxx import ...导入使用。
2. 常用 Flask 扩展
| 扩展名 | 用途 | 安装命令 |
|---|---|---|
| Flask-SQLAlchemy | 数据库 ORM 操作 | pip install Flask-SQLAlchemy |
| Flask-Migrate | 数据库迁移(基于 Alembic) | pip install Flask-Migrate |
| Flask-Login | 用户认证和会话管理 | pip install Flask-Login |
| Flask-WTF | 表单处理和 CSRF 防护 | pip install Flask-WTF |
| Flask-Mail | 发送电子邮件 | pip install Flask-Mail |
| Flask-RESTful | 快速构建 RESTful API | pip install Flask-RESTful |
| Flask-CORS | 处理跨域资源共享(CORS) | pip install Flask-CORS |
| Flask-Session | 服务端 Session 存储(Redis、数据库等) | pip install Flask-Session |
| Flask-Caching | 缓存支持(Memcached、Redis 等) | pip install Flask-Caching |
| Flask-Limiter | API 限流 | pip install Flask-Limiter |
| Flask-SocketIO | WebSocket 实时通信 | pip install Flask-SocketIO |
| Flask-Marshmallow | 对象序列化/反序列化 | pip install Flask-Marshmallow |
| Flask-Admin | 后台管理界面 | pip install Flask-Admin |
| Flask-Bcrypt | 密码哈希加密 | pip install Flask-Bcrypt |
3. 扩展的使用模式
python
from flask import Flask
from flask_sqlalchemy import SQLAlchemy # 导入扩展
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
db = SQLAlchemy(app) # 初始化扩展,绑定到应用实例
# 定义模型
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
4. 工厂模式中初始化扩展
在大型项目中,通常使用工厂函数 创建应用,扩展在应用之外创建,稍后通过 init_app() 绑定:
python
# extensions.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy() # 不传入 app
# app.py(工厂函数)
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
db.init_app(app) # 在工厂函数中绑定 app
return app
这种方式的好处:
- 支持创建多个不同配置的应用实例(方便测试)。
- 避免循环导入问题。
十一、本章小结
核心知识回顾
| 知识点 | 关键内容 |
|---|---|
| Flask 是什么 | 基于 Werkzeug + Jinja2 的轻量级 Python Web 框架 |
| 虚拟环境 | 使用 venv 或 virtualenv 隔离项目依赖,是 Python 开发的标准实践 |
| 安装 Flask | pip install Flask,自动安装所有依赖包 |
| PyCharm 配置 | 在 Settings → Python Interpreter 中关联虚拟环境 |
| Hello Flask | 导入 → 创建实例 → 定义路由和视图函数 → app.run() |
__name__ 的作用 |
帮助 Flask 确定资源(模板/静态文件)的查找路径 |
| 路由与视图函数 | @app.route('/path') 装饰器将 URL 绑定到 Python 函数 |
| 调试模式 | debug=True 开启自动重载和交互式调试器(仅限开发环境) |
| 配置管理 | 通过 app.config(字典)管理配置,推荐使用配置类 + from_object() |
| 扩展包 | 通过第三方扩展为 Flask 增添数据库、认证、表单等功能 |
第一章的核心要点
- Flask = 微框架 + 扩展生态:核心精简,功能按需组合。
- 虚拟环境是必备技能:每个 Python Web 项目都应使用独立的虚拟环境。
- 配置管理要规范 :区分开发、测试、生产环境的配置,敏感信息(如
SECRET_KEY)不要硬编码,应使用环境变量。 - 调试模式的双刃剑:开发时方便,生产环境绝对不能开启。
- Flask 的灵活性:没有"约定优于配置"的束缚,一切由开发者决定------这既是优势也是责任。