博主导读:Flask是Python最热门的轻量级Web微框架,凭借轻量、灵活、高可扩展的特点,成为新手入门Python Web开发、快速搭建API和中小型网站的首选框架。本文整合Flask全套核心知识点,从框架简介、基础语法、模板表单、数据库开发、用户认证、API开发、项目架构到线上部署,一站式讲解,零基础也能轻松看懂,建议收藏反复学习!
适用人群:Python Web新手、想快速上手Flask开发、需要搭建后端API的开发者
学习目标:掌握Flask核心语法、项目架构、常用扩展、CRUD开发及生产环境部署
一、前言
在Python Web开发领域,Flask凭借轻量极简、高度灵活、生态丰富的核心优势,稳居主流框架行列。和重型全能框架不同,Flask核心只保留Web开发必备功能,不强制绑定任何组件,开发者可以根据项目需求自由搭配扩展插件,完美适配小型API、个人博客、中小型企业网站等各类场景。
无论你是零基础入门Web开发,还是从其他Python框架迁移,这篇系统化教程都能帮你从零搭建知识体系,独立开发规范、安全、可落地的Flask Web应用。
二、Flask 框架简介
2.1 什么是Flask?
Flask是一款轻量级Python Web微框架,由Armin Ronacher开发,底层基于Werkzeug WSGI工具包和Jinja2模板引擎。
所谓"微框架",核心特点是核心精简、按需扩展:框架本身只包含路由、请求响应等基础Web核心能力,数据库、表单验证、用户认证等高级功能,全部通过第三方扩展实现,极大提升了项目灵活性。
Flask核心特点总结:
-
轻量高效:代码简洁、启动速度快、服务器资源占用极低
-
超高灵活:无强制项目结构,组件自由选择搭配
-
入门简单:API设计直观,学习曲线平缓,新手友好
-
可扩展性强:海量官方、第三方扩展,按需叠加功能
-
路由强大:支持动态URL变量、自定义HTTP请求方法
-
开箱即用:内置开发服务器,无需额外配置即可本地测试
-
适配API开发:天然支持RESTful风格接口开发
2.2 Flask vs Django 核心对比
Flask和Django是Python Web两大主流框架,二者设计理念截然不同,适配的项目场景也有明显区别,新手可根据需求选择:
| 对比特性 | Flask(微框架) | Django(全能框架) |
|---|---|---|
| 架构理念 | 核心极简,完全自定义扩展 | 内置全套功能,一站式解决方案 |
| 学习难度 | 低,上手快,知识点集中 | 高,概念多、规范严格 |
| 适配项目 | 小型网站、API服务、轻量化项目 | 中大型企业级项目、后台管理系统 |
| 开发自由度 | 极高,无强制开发规范 | 较低,必须遵循Django开发模式 |
| 数据库支持 | 依赖Flask-SQLAlchemy扩展 | 内置ORM框架,开箱即用 |
| 管理后台 | 需自行开发或依赖扩展 | 内置强大的后台管理系统 |
2.3 Flask 环境安装(超详细)
推荐使用虚拟环境安装Flask,避免全局依赖冲突,适配所有操作系统。
1、创建并激活虚拟环境
# 创建虚拟环境
python -m venv venv
# Windows激活虚拟环境
venv\Scripts\activate
# Linux/Mac激活虚拟环境
source venv/bin/activate
2、安装Flask
pip install flask
3、验证安装是否成功
python -c "import flask; print(flask.__version__)"
输出版本号即代表安装成功。
三、Flask 核心基础知识(必学)
3.1 第一个Flask项目(Hello World)
Flask项目启动极其简单,仅需十几行代码,创建app.py核心文件:
from flask import Flask
# 初始化Flask应用实例
app = Flask(__name__)
# 定义根路由
@app.route('/')
def hello_world():
return 'Hello, Flask!欢迎学习Python Web开发'
# 启动项目
if __name__ == '__main__':
app.run(debug=True)
运行项目
python app.py
启动成功后,浏览器访问 http://127.0.0.1:5000/ 即可看到页面内容。
参数说明 :debug=True 开启调试模式,代码修改后自动重启项目,开发阶段推荐开启,生产环境必须关闭。
3.2 应用实例核心原理
app = Flask(__name__) 是Flask项目的核心,__name__ 是Python内置特殊变量,代表当前模块名称。
Flask通过该参数自动定位项目的模板文件、静态资源、配置文件路径,是项目初始化的关键。
3.3 路由系统(核心重点)
路由的作用是将浏览器URL地址与后端视图函数绑定,用户访问对应URL,后端执行对应函数并返回结果。Flask采用装饰器快速定义路由,语法简洁。
3.3.1 动态URL变量
支持在URL中传递参数,自带多种数据类型校验:
-
默认字符串:
<变量名> -
整数:
<int:变量名> -
浮点数:
<float:变量名> -
路径:
<path:变量名> -
UUID:
<uuid:变量名>
示例代码:
from flask import Flask
app = Flask(__name__)
# 动态整数路由
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'当前访问文章ID:{post_id}'
# 动态字符串路由
@app.route('/user/<username>')
def show_user(username):
return f'欢迎用户:{username}'
if __name__ == '__main__':
app.run(debug=True)
3.3.2 限定HTTP请求方法
默认路由仅支持GET请求,可通过methods参数指定多种请求方法,适配表单提交、接口请求等场景:
from flask import Flask, request
app = Flask(__name__)
@app.route('/login', methods=['GET', 'POST'])
def login():
# GET请求:展示登录页面
if request.method == 'GET':
return '请输入账号密码登录'
# POST请求:处理登录提交
elif request.method == 'POST':
return '登录请求提交成功'
if __name__ == '__main__':
app.run(debug=True)
3.4 视图函数多种返回格式
视图函数是处理请求、返回响应的核心函数,支持多种返回类型,适配不同开发场景:
-
普通字符串(简单页面展示)
-
HTML模板(前端页面渲染)
-
JSON数据(API接口开发)
-
页面重定向
-
自定义响应对象、Cookie
综合示例:
from flask import Flask, render_template, jsonify, redirect, url_for, make_response
app = Flask(__name__)
# 1. 返回JSON(API常用)
@app.route('/api/data')
def get_data():
return jsonify(name="Flask", type="Web框架", status="正常")
# 2. 页面重定向
@app.route('/go-index')
def go_index():
return redirect(url_for('hello_world'))
# 3. 自定义响应、设置Cookie
@app.route('/set-cookie')
def set_cookie():
resp = make_response("Cookie设置成功")
resp.set_cookie("username", "flask_blog")
return resp
if __name__ == '__main__':
app.run(debug=True)
3.5 请求对象与响应对象
3.5.1 Request请求对象
通过request对象可获取前端传递的所有数据(表单、URL参数、JSON、文件等):
from flask import Flask, request
app = Flask(__name__)
@app.route('/submit', methods=['POST'])
def submit():
# 获取表单数据
username = request.form.get('username')
# 获取URL查询参数
page = request.args.get('page', 1, type=int)
# 获取前端JSON数据
data = request.get_json()
# 获取上传文件
file = request.files.get('file')
return f"用户名:{username},当前页码:{page}"
3.5.2 Response响应对象
支持自定义响应状态码、响应头、Cookie,灵活适配业务需求:
from flask import Flask, make_response
app = Flask(__name__)
@app.route('/response')
def custom_response():
# 自定义内容、状态码、响应头
return "自定义响应内容", 201, {"Custom-Header": "Flask-Blog"}
四、Jinja2模板系统
Flask默认搭载Jinja2模板引擎,用于实现前后端分离渲染,后端传递数据,前端通过模板语法动态展示页面,是开发Web页面的核心功能。
4.1 模板基础规范
Flask默认从项目根目录的templates文件夹中读取HTML模板文件,静态文件(CSS、JS、图片)默认放在static文件夹。
基础模板示例(templates/index.html):
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<h1>Hello, {{ name }}!</h1>
{% if messages %}
<ul>
{% for msg in messages %}
<li>{{ msg }}</li>
{% endfor %}
</ul>
{% else %}
<p>暂无消息</p>
{% endif %}
</body>
</html>
后端视图渲染模板:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
# 向后端模板传递参数
return render_template('index.html',
title='Flask模板演示',
name='开发者',
messages=['第一条消息', '第二条消息'])
if __name__ == '__main__':
app.run(debug=True)
4.2 Jinja2核心语法
模板语法分为三类,简单易记:

4.2.1 变量过滤器
可对模板变量快速处理,常用过滤器:
{{ name|capitalize }} <!-- 首字母大写 -->
{{ name|lower }} <!-- 全部小写 -->
{{ text|truncate(50) }} <!-- 截断50字符 -->
{{ data|tojson }} <!-- 转为JSON格式 -->
{{ text|striptags }} <!-- 去除HTML标签 -->
{{ value|default("默认值") }} <!-- 无数据时显示默认值 -->
4.3 模板继承(重点)
模板继承是Jinja2的核心功能,可定义公共父模板(导航栏、页脚、样式),子模板直接继承复用,避免代码冗余,是项目规范化开发的关键。
父模板:base.html
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}默认标题{% endblock %}</title>
{% block styles %}{% endblock %}
</head>
<body>
<header>公共导航栏</header>
<main>
{% block content %}{% endblock %}
</main>
<footer>© 2026 Flask开发博客{% endblock %}</footer>
{% block scripts %}{% endblock %}
</body>
</html>
子模板:page.html
{% extends "base.html" %}
{% block title %}页面专属标题{% endblock %}
{% block content %}
<h2>页面专属内容</h2>
<p>继承父模板,仅需重写核心内容区块</p>
{% endblock %}
4.4 静态文件引用
所有静态资源(CSS、JS、图片)统一放在static文件夹,通过url_for动态引用:
<!-- 引用样式表 -->
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
<!-- 引用图片 -->
<img src="{{ url_for('static', filename='images/logo.png') }}">
<!-- 引用JS文件 -->
<script src="{{ url_for('static', filename='js/script.js') }}"></script>
五、表单处理与文件上传
表单是Web交互的核心,用于接收用户输入(登录、注册、提交信息、上传文件等),Flask支持原生表单处理和WTForms高级表单验证。
5.1 原生表单处理
无需第三方扩展,通过request对象直接获取表单数据,适合简单场景:
前端登录模板 login.html
<!DOCTYPE html>
<html>
<body>
<h3>用户登录</h3>
{% if error %}
<p style="color:red">{{ error }}</p>
{% endif %}
<form method="post">
<p>用户名:<input type="text" name="username" required></p>
<p>密码:<input type="password" name="password" required></p>
<button type="submit">登录</button>
</form>
</body>
</html>
后端视图逻辑
from flask import Flask, render_template, request, redirect, url_for
app = Flask(__name__)
app.config['SECRET_KEY'] = '123456'
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
# 简单校验
if username == "admin" and password == "123456":
return "登录成功!"
else:
return render_template('login.html', error="用户名或密码错误")
return render_template('login.html')
if __name__ == '__main__':
app.run(debug=True)
5.2 Flask-WTF 高级表单验证
复杂项目推荐使用Flask-WTF扩展,自带表单校验、CSRF防跨站攻击、错误提示等功能,是企业级开发标配。
1、安装扩展
pip install flask-wtf
2、定义表单类
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Email, Length
# 登录表单类
class LoginForm(FlaskForm):
# 邮箱字段:非空、邮箱格式校验
email = StringField("邮箱", validators=[DataRequired(), Email()])
# 密码字段:非空、长度至少6位
password = PasswordField("密码", validators=[DataRequired(), Length(min=6)])
submit = SubmitField("立即登录")
3、视图与模板使用
视图中接收表单、自动校验,模板中展示错误信息,无需手动判断。
5.3 文件上传功能实现
实现图片、文档上传功能,核心要点:表单添加enctype="multipart/form-data"、后端校验文件格式、保存文件。
from flask import Flask, request
from werkzeug.utils import secure_filename
import os
app = Flask(__name__)
# 配置上传文件夹和允许的文件格式
app.config['UPLOAD_FOLDER'] = 'uploads'
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'txt', 'pdf'}
# 校验文件格式
def allowed_file(filename):
return '.' in filename and filename.rsplit('.',1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/upload', methods=['GET','POST'])
def upload_file():
if request.method == 'POST':
file = request.files['file']
if file.filename == '' or not allowed_file(file.filename):
return "文件为空或格式不支持"
# 安全保存文件
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return f"文件{filename}上传成功!"
# GET请求展示上传页面
return '''
<form method="post" enctype="multipart/form-data">
<input type="file" name="file">
<button type="submit">上传文件</button>
</form>
'''
if __name__ == '__main__':
# 自动创建上传文件夹
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
app.run(debug=True)
六、数据库集成(Flask-SQLAlchemy)
数据库是Web项目核心,Flask通过Flask-SQLAlchemy扩展实现ORM数据库操作,无需编写原生SQL语句,适配SQLite、MySQL、PostgreSQL等主流数据库。
6.1 安装与基础配置
pip install flask-sqlalchemy
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# 配置数据库连接(默认SQLite,无需额外服务)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
# 关闭多余警告
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 初始化数据库对象
db = SQLAlchemy(app)
6.2 定义数据库模型
模型类对应数据库表,属性对应表字段,支持主键、唯一约束、外键、关联关系。
# 用户模型
class User(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(30), unique=True, nullable=False)
email = db.Column(db.String(50), unique=True, nullable=False)
password = db.Column(db.String(100), nullable=False)
# 一对多关联:一个用户多篇文章
posts = db.relationship('Post', backref='author', lazy=True)
# 文章模型
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(100), nullable=False)
content = db.Column(db.Text, nullable=False)
# 外键:关联用户表
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
# 创建数据表
with app.app_context():
db.create_all()
6.3 数据库CRUD增删改查
1、新增数据(Create)
@app.route('/add-user')
def add_user():
user = User(username="test01", email="test@163.com", password="123456")
db.session.add(user)
db.session.commit()
return "用户创建成功"
2、查询数据(Read)
# 查询所有用户
users = User.query.all()
# 根据ID查询
user = User.query.get(1)
# 条件查询
user = User.query.filter_by(username="test01").first()
# 模糊查询
users = User.query.filter(User.email.endswith('@163.com')).all()
3、更新数据(Update)
@app.route('/update-user/<int:uid>')
def update_user(uid):
user = User.query.get_or_404(uid)
user.username = "新用户名"
db.session.commit()
return "用户信息更新成功"
4、删除数据(Delete)
@app.route('/del-user/<int:uid>')
def del_user(uid):
user = User.query.get_or_404(uid)
db.session.delete(user)
db.session.commit()
return "用户删除成功"
6.4 数据库迁移(Flask-Migrate)
项目迭代中需要修改表结构,通过Flask-Migrate实现数据库迁移,不丢失数据。
# 安装
pip install flask-migrate
# 初始化配置
from flask_migrate import Migrate
migrate = Migrate(app, db)
终端执行命令:
flask db init # 初始化迁移仓库
flask db migrate # 生成迁移脚本
flask db upgrade # 执行迁移,更新数据库
七、用户认证与权限管理
几乎所有Web项目都需要登录认证、密码加密、权限控制,Flask通过专用扩展快速实现企业级安全方案。
7.1 Flask-Login 登录态管理
实现用户登录、登出、登录状态校验、路由保护功能。
pip install flask-login
核心配置:自动管理用户session,保护需要登录的路由。
7.2 Flask-Bcrypt 密码加密
禁止明文存储密码,通过哈希算法加密,保障账号安全。
pip install flask-bcrypt
实现密码加密与校验:
from flask_bcrypt import Bcrypt
bcrypt = Bcrypt(app)
# 密码加密
pwd = "123456"
hash_pwd = bcrypt.generate_password_hash(pwd).decode("utf-8")
# 密码校验
is_right = bcrypt.check_password_hash(hash_pwd, "123456")
7.3 角色权限控制
自定义装饰器,实现管理员、普通用户权限区分,精准控制接口和页面访问权限。
八、RESTful API开发
Flask是开发轻量级API的首选框架,可快速实现符合REST规范的前后端分离接口,适配小程序、APP、前端Vue/React项目。
8.1 基础API接口开发
通过jsonify返回标准JSON格式数据,实现接口的增删改查。
8.2 Flask-RESTful 结构化API
通过类的方式管理接口,统一接口格式、参数校验、响应规范,适合大型API项目。
8.3 API认证与文档生成
-
支持基础账号密码认证、Token令牌认证,保护接口安全
-
集成Swagger自动生成API文档,支持在线调试
-
支持API版本控制,兼容迭代更新
九、项目架构优化:蓝图与工程化
单文件项目仅适合测试,正式项目必须通过**蓝图(Blueprint)**实现模块化拆分,解耦代码、方便维护。
9.1 蓝图核心作用
-
拆分业务模块:用户模块、文章模块、后台模块、API模块
-
每个模块独立管理路由、模板、静态文件
-
支持蓝图嵌套、统一前缀,项目结构清晰
9.2 应用工厂模式
通过create_app()函数延迟创建应用实例,支持多环境配置、单元测试、灵活部署,是企业级Flask项目标准写法。
9.3 标准项目目录结构
适配中大型项目的规范化结构,拆分模型、视图、表单、静态资源、配置文件:
my_flask_project/
├── app/ # 项目核心目录
│ ├── __init__.py # 应用工厂
│ ├── models/ # 数据库模型
│ ├── views/ # 蓝图视图
│ ├── forms/ # 表单类
│ ├── static/ # 静态资源
│ ├── templates/ # 模板文件
│ └── utils/ # 工具函数
├── migrations/ # 数据库迁移文件
├── tests/ # 单元测试
├── config.py # 全局配置
├── requirements.txt # 依赖列表
└── run.py # 项目入口
十、生产环境部署与运维
Flask内置服务器仅用于开发测试,生产环境需要搭配WSGI服务器、Nginx反向代理,实现稳定、安全、高性能的线上部署。
10.1 部署核心准备工作
-
关闭debug调试模式,避免信息泄露
-
敏感配置(密钥、数据库密码)通过环境变量配置
-
配置日志收集、异常监控
-
开启缓存,优化项目性能
10.2 生产级服务器配置
1、Gunicorn WSGI服务器
pip install gunicorn
# 启动命令:4个进程,绑定端口
gunicorn -w 4 -b 0.0.0.0:5000 run:app
2、Nginx反向代理
处理静态资源、SSL证书、请求分发、负载均衡,提升项目稳定性。
10.3 Docker容器化部署
通过Docker打包项目,实现一次构建、随处运行,解决环境兼容问题,搭配Docker Compose可快速部署多容器项目。
10.4 监控与CI/CD自动化部署
-
错误监控:Sentry实时捕获项目异常
-
性能监控:Prometheus+Grafana统计接口性能
-
自动化部署:GitHub Actions实现代码提交自动测试、部署
十一、总结与学习建议
11.1 Flask核心优势
-
极简高效:核心代码精简,启动快、资源占用低
-
极度灵活:无强制规范,自由搭配技术栈
-
生态完善:海量扩展覆盖认证、数据库、API、缓存等所有场景
-
入门友好:学习成本低,适合新手入门Web开发