Flask入门学习教程,从入门到精通, 认识Flask —— 知识点详解 (1)

认识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 及以上)。

  • 安装完成后,通过命令行验证:

    bash 复制代码
    python --version
    # 或
    python3 --version
  • 确保 pip 已安装并可正常使用:

    bash 复制代码
    pip --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. 下载与安装

  1. 访问官网:https://www.jetbrains.com/pycharm/
  2. 根据操作系统下载对应安装包(Windows / macOS / Linux)。
  3. 安装时建议勾选:
    • 创建桌面快捷方式
    • 关联 .py 文件
    • 添加到系统 PATH(可选)
  4. 首次启动后选择主题风格(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. 创建新项目时配置

  1. 打开 PyCharm → New Project
  2. 展开 Python Interpreter 选项。
  3. 选择 New environment usingVirtualenv
  4. 设置:
    • Location :虚拟环境存放路径(默认在项目目录下创建 venv)。
    • Base interpreter:选择系统中已安装的 Python 解释器版本。
    • Inherit global site-packages:是否继承全局已安装的包(通常不勾选,保持隔离)。
    • Make available to all projects:是否让其他项目也能使用此环境(通常不勾选)。
  5. 点击 Create 完成。

2. 为已有项目配置虚拟环境

  1. 打开 PyCharm → FileSettings (macOS 为 PyCharmPreferences)。
  2. 进入 Project: 项目名Python Interpreter
  3. 点击右上角齿轮图标 → Add InterpreterAdd Local Interpreter
  4. 选择 Virtualenv Environment
    • Existing :选择已有的虚拟环境路径(找到 venv/bin/pythonvenv\Scripts\python.exe)。
    • New:创建新的虚拟环境。
  5. 点击 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 框架
虚拟环境 使用 venvvirtualenv 隔离项目依赖,是 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 增添数据库、认证、表单等功能

第一章的核心要点

  1. Flask = 微框架 + 扩展生态:核心精简,功能按需组合。
  2. 虚拟环境是必备技能:每个 Python Web 项目都应使用独立的虚拟环境。
  3. 配置管理要规范 :区分开发、测试、生产环境的配置,敏感信息(如 SECRET_KEY)不要硬编码,应使用环境变量。
  4. 调试模式的双刃剑:开发时方便,生产环境绝对不能开启。
  5. Flask 的灵活性:没有"约定优于配置"的束缚,一切由开发者决定------这既是优势也是责任。
相关推荐
xG8XPvV5d3 小时前
PyTorch特征提取器源码精析
人工智能·pytorch·python
编程的一拳超人3 小时前
AI Agent 在“压榨式”工作条件下会表现出马克思主义倾向
python
huzhongqiang3 小时前
扩展 Python 事件机制:支持等待事件消失
后端·python
xwz小王子3 小时前
SkiP:让模仿学习学会“快进“——动作重标记如何在不改架构的情况下削减机器人 15-40% 的执行步数
学习·架构·机器人
糖果店的幽灵3 小时前
LangChain 基于 Python 的技术- agent模块使用总结
开发语言·python·langchain
GEO从入门到精通3 小时前
GEO学习与传统SEO学习有什么区别?
人工智能·学习·microsoft
weixin_386468963 小时前
openharmony 6.0编译rk3568过程记录
c语言·c++·git·python·vim·harmonyos·openharmony
其实防守也摸鱼3 小时前
upload-labs靶场的pass-13~21的解题步骤及原理讲解
python·安全·网络安全·靶场·二进制·文件上传漏洞·文件包含漏洞
俊哥工具4 小时前
不用安装不收费!多功能U盘修复工具,解决大部分U盘故障
学习·pdf·word·excel·音视频