Flask 教程(保姆级教程)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言:为什么选择 Flask 作为 Web 开发入门框架?

在众多 Python Web 框架中,Flask 凭借其简洁性、灵活性和低学习门槛,成为编程初学者和中级开发者入门的首选工具。它如同一把轻便的瑞士军刀,既能快速搭建原型系统,又能通过扩展库实现复杂功能。对于编程新手来说,Flask 的核心代码直观易懂,适合理解 Web 开发的基本原理;对于中级开发者,则能通过其模块化设计快速完成项目迭代。本文将以 Flask 教程 为核心,从环境搭建到高级功能,循序渐进地展示如何利用 Flask 构建完整的 Web 应用。


Flask 教程:环境搭建与基础路由

安装与项目结构

首先需要安装 Flask,通过 pip 命令即可完成:

pip install Flask

创建一个简单的项目文件夹,例如 my_flask_app,并在其中新建 app.py 文件。一个最基础的 Flask 应用结构如下:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello World from Flask!'

if __name__ == '__main__':
    app.run()

这里 @app.route('/') 定义了根路径的路由规则,hello() 函数返回响应内容。运行 python app.py 后,访问 http://localhost:5000 即可看到输出。

路由参数与动态 URL

路由的灵活性是 Flask 的核心优势之一。通过 <变量名> 可以捕获动态路径参数:

@app.route('/user/<username>')
def show_user_profile(username):
    return f'User: {username}'

若需指定参数类型,可添加类型声明(如 <int:user_id>),系统会自动将字符串转换为对应类型:

@app.route('/post/<int:post_id>')
def show_post(post_id):
    return f'Post ID: {post_id}'

请求方法与表单处理

HTTP 方法控制路由的行为。例如,methods=['POST'] 限制路由仅接收 POST 请求:

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        return f'Logged in as {username}'
    return '''<form method="post">
              Username: <input type=text name=username>
              <input type=submit value=Login>
              </form>'''

Flask 教程:模板引擎与静态文件管理

模板基础:Jinja2 的语法解析

Flask 默认使用 Jinja2 模板引擎,通过 render_template 函数渲染模板文件。在项目根目录创建 templates 文件夹,存放 HTML 文件:

from flask import render_template

@app.route('/hello/<name>')
def hello_template(name):
    return render_template('hello.html', username=name)

对应的 hello.html 内容如下:

<!DOCTYPE html>
<html>
<head><title>Hello Page</title></head>
<body>
    <h1>Hello, {{ username }}!</h1>
</body>
</html>

宏与继承:构建可复用的模板结构

通过 {% extends %} 实现模板继承,减少重复代码。例如定义基础模板 base.html

<!-- base.html -->
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    {% block content %}{% endblock %}
</body>
</html>

子模板继承后可覆盖区块:

<!-- child.html -->
{% extends "base.html" %}
{% block title %}My Page{% endblock %}
{% block content %}
    <h1>Welcome to My Page</h1>
{% endblock %}

静态文件的组织方式

静态资源(CSS、JS、图片)应存放在 static 文件夹内。在模板中引用时,使用 url_for 生成路径:

return render_template('index.html')
<!-- index.html -->
<link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}">
<img src="{{ url_for('static', filename='img/logo.png') }}">

Flask 教程:表单验证与用户会话管理

使用 WTForms 进行表单验证

WTForms 是 Flask 的推荐表单库,通过类定义和验证器实现复杂验证逻辑:

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import InputRequired, Email

class LoginForm(FlaskForm):
    username = StringField('Username', validators=[InputRequired()])
    password = PasswordField('Password', validators=[InputRequired()])

在视图函数中集成表单验证:

@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        return f'Logged in as {form.username.data}'
    return render_template('login.html', form=form)

会话管理:安全持久化用户状态

Flask 的 session 对象基于签名 cookie,需设置密钥:

app.secret_key = 'your_secret_key_here'

保存和读取会话数据示例:

from flask import session

@app.route('/login', methods=['POST'])
def login():
    session['user_id'] = 123
    return 'Logged in'

@app.route('/profile')
def profile():
    user_id = session.get('user_id')
    return f'User ID: {user_id}'

Flask 教程:数据库集成与 ORM 使用

SQLAlchemy 的基本操作

安装扩展库:

pip install Flask-SQLAlchemy

配置数据库连接并定义模型:

from flask_sqlalchemy import SQLAlchemy

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True, nullable=False)

执行数据库操作:

db.create_all()

new_user = User(name='Alice')
db.session.add(new_user)
db.session.commit()

user = User.query.filter_by(name='Alice').first()

RESTful API 开发实践

通过 Flask-RESTful 扩展快速构建 API:

from flask_restful import Api, Resource

api = Api(app)

class UserAPI(Resource):
    def get(self, user_id):
        user = User.query.get_or_404(user_id)
        return {'name': user.name}

api.add_resource(UserAPI, '/api/users/<int:user_id>')

Flask 教程:进阶功能与性能优化

蓝图(Blueprint)的模块化设计

使用蓝图划分功能模块:

from flask import Blueprint

auth = Blueprint('auth', __name__)

@auth.route('/login')
def login():
    return 'Login View'

app.register_blueprint(auth, url_prefix='/auth')

调试与部署准备

开发阶段启用调试模式:

app.run(debug=True)

生产环境部署可使用 Gunicorn:

pip install gunicorn
gunicorn app:app

性能优化技巧

  • 使用 Flask-Caching 缓存频繁访问的数据
  • 配置 Nginx 反向代理和静态文件服务
  • 通过 Flask-Profiler 进行性能分析

结论:Flask 的学习路径与应用场景

通过本文的 Flask 教程,我们从基础到进阶,系统性地学习了路由设计、模板引擎、表单验证、数据库集成等核心功能。对于初学者,建议从简单 CRUD 应用开始,逐步尝试 RESTful API 和多模块项目;中级开发者则可深入扩展库的使用,探索 Celery 异步任务、Flask-Security 权限控制等高级功能。

Flask 的灵活性使其适用于多种场景,包括小型企业网站、API 后端、数据分析仪表盘等。随着项目复杂度的提升,开发者可根据需求选择合适扩展,逐步构建出高性能、可维护的 Web 应用。记住,最好的学习方式是动手实践——现在就尝试用 Flask 构建自己的第一个项目吧!

最新发布