Python Flask超全入门实战教程|从零基础到项目部署

博主导读: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核心优势

  1. 极简高效:核心代码精简,启动快、资源占用低

  2. 极度灵活:无强制规范,自由搭配技术栈

  3. 生态完善:海量扩展覆盖认证、数据库、API、缓存等所有场景

  4. 入门友好:学习成本低,适合新手入门Web开发

相关推荐
databook1 小时前
Manim物理模拟:别自己写欧拉了!
python·数学·动效
香蕉鼠片2 小时前
Python进阶学习
开发语言·python
亚亚的学习和分享3 小时前
python练习:人生模拟器(简易版)
python
全糖可乐气泡水3 小时前
Codex适配国产信创环境安装部署与技术适配全解析
开发语言·git·python·算法·百度
LeocenaY3 小时前
搜集的一些测开面试题
开发语言·python
嗝o゚3 小时前
昇腾CANN ge 仓的图优化 Pass:哪些 Pass 真正影响推理性能
pytorch·python·深度学习·cann·ge-pass
深度先生4 小时前
Conda 全面讲解——数据科学家的标配工具
python
知识分享小能手4 小时前
Flask入门学习教程,从入门到精通,数据库操作 — 知识点详解与案例代码(4)
数据库·学习·flask
深度先生4 小时前
虚拟环境:别让包打架
python