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+ 小伙伴加入学习 ,欢迎点击围观

前言

在 Web 开发领域,Flask 是一个轻量级、灵活且易于上手的 Python 框架。它以“微框架”(Microframework)为设计理念,提供核心功能的同时,允许开发者通过扩展自由扩展功能。对于编程初学者而言,Flask 是入门 Web 开发的理想工具;而中级开发者则可以通过它快速搭建复杂应用。本文将从基础概念出发,结合实例代码,系统性地解析 Flask 的核心机制与应用场景。


一、Flask 是什么?

1.1 Flask 的定位与特点

Flask 是由 Armin Ronacher 开发的 Python Web 框架,其核心设计原则是“轻量级”与“扩展性”。它不强制开发者遵循特定的目录结构或技术栈,而是通过简单易用的 API 提供基础功能,例如路由、请求处理、模板渲染等。

核心特点包括

  • 灵活性:开发者可以自由选择数据库、模板引擎或认证系统。
  • 社区支持:丰富的扩展(如 Flask-SQLAlchemy、Flask-Login)覆盖常见需求。
  • 学习曲线平缓:基础概念简单,适合新手快速上手。

形象比喻
将 Flask 比作一套乐高积木,开发者可以自由拼接不同功能模块(如表单验证、数据库连接),而不必受限于预设的“玩具套装”。

1.2 Flask 的适用场景

  • 快速原型开发(如 MVP 阶段的应用)。
  • 中小型 Web 应用,尤其是需要自定义功能的场景。
  • API 后端开发(如 RESTful API)。

二、Flask 核心概念详解

2.1 应用对象(App Object)

Flask 的核心是 Flask 类的实例,称为“应用对象”。它是整个 Web 应用的入口,负责管理路由、请求处理、配置等。

示例代码

from flask import Flask  
app = Flask(__name__)  # 创建应用对象  

关键点

  • __name__ 参数用于确定应用的根目录路径,方便 Flask 加载静态文件或模板。
  • 应用对象是全局的,开发者通过它注册路由、配置扩展等。

2.2 路由系统(Routing)

路由是 Flask 的核心功能之一,它将 URL 映射到对应的 Python 函数(称为“视图函数”)。

基础语法

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

核心概念

  • 装饰器 @app.route:将函数与指定的 URL 路径绑定。
  • 动态路由参数:通过 <变量名> 在 URL 中捕获动态值。
    @app.route('/user/<username>')  
    def show_user_profile(username):  
        return f'User: {username}'  
    
  • HTTP 方法:通过 methods 参数指定支持的请求方法(如 GET、POST)。
    @app.route('/submit', methods=['POST'])  
    def submit_form():  
        return 'Form submitted!'  
    

2.3 请求与响应(Request and Response)

Flask 通过 request 对象访问客户端请求数据,通过返回值生成响应。

2.3.1 请求对象 request

  • 表单数据request.form 获取 POST 请求的表单数据。
  • 查询参数request.args 获取 URL 中的查询参数(如 ?page=2)。
  • JSON 数据request.get_json() 解析 JSON 格式的请求体。

示例:处理表单提交

@app.route('/login', methods=['POST'])  
def login():  
    username = request.form['username']  
    password = request.form['password']  
    # 验证逻辑...  
    return f'Login success for {username}'  

2.3.2 响应对象

  • 直接返回字符串:默认返回 200 OK 状态码,内容为字符串。
  • 自定义响应:使用 make_response()redirect()
    from flask import redirect  
    @app.route('/redirect')  
    def redirect_example():  
        return redirect('https://flask.palletsprojects.com')  
    

三、模板引擎:Jinja2

Flask 内置了 Jinja2 模板引擎,用于动态生成 HTML 内容。模板文件通常存放在 templates 目录中。

3.1 基本语法

3.1.1 变量渲染

在模板中使用 {{ variable }} 插入变量值。

<!-- templates/hello.html -->  
<h1>Hello, {{ name }}!</h1>  

对应视图函数:

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

3.1.2 控制结构

使用 {% %} 标签实现条件判断或循环。

<ul>  
  {% for item in items %}  
    <li>{{ item }}</li>  
  {% endfor %}  
</ul>  

3.2 模板继承

通过 extends 关键字实现模板继承,减少重复代码。例如,定义一个基础模板 base.html

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

子模板继承并覆盖 block

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

四、Flask 扩展机制

Flask 通过扩展(Extensions)增强功能,常见的扩展包括:

  • 数据库操作:Flask-SQLAlchemy、Flask-MongoEngine。
  • 认证与授权:Flask-Login、Flask-JWT-Extended。
  • 表单验证:Flask-WTF。

4.1 扩展的使用流程

  1. 安装扩展:通过 pip 安装。
    pip install flask-sqlalchemy  
    
  2. 初始化扩展:将扩展对象绑定到应用实例。
    from flask_sqlalchemy import SQLAlchemy  
    db = SQLAlchemy()  
    db.init_app(app)  
    
  3. 使用扩展功能:例如定义数据库模型。
    class User(db.Model):  
        id = db.Column(db.Integer, primary_key=True)  
        username = db.Column(db.String(80), unique=True, nullable=False)  
    

五、项目结构与配置管理

5.1 推荐的项目结构

一个典型的 Flask 项目结构如下:

my_flask_app/  
├── app/  
│   ├── __init__.py  
│   ├── models.py  
│   ├── routes.py  
│   └── templates/  
├── config.py  
├── requirements.txt  
└── run.py  
  • app/__init__.py:创建应用实例并注册蓝图或扩展。
  • config.py:定义不同环境的配置(如开发、生产环境)。

5.2 配置管理

通过 app.config 或配置类管理应用参数。例如:

class Config:  
    DEBUG = True  
    SQLALCHEMY_DATABASE_URI = 'sqlite:///mydatabase.db'  

app.config.from_object(Config)  

六、实战案例:构建一个简单的博客系统

6.1 功能需求

  • 展示文章列表。
  • 新增文章(通过表单提交)。

6.2 代码实现

6.2.1 定义模型(使用 Flask-SQLAlchemy)

from flask_sqlalchemy import SQLAlchemy  
db = SQLAlchemy(app)  

class Post(db.Model):  
    id = db.Column(db.Integer, primary_key=True)  
    title = db.Column(db.String(100), nullable=False)  
    content = db.Column(db.Text, nullable=False)  

6.2.2 创建路由与表单

from flask_wtf import FlaskForm  
from wtforms import StringField, TextAreaField, SubmitField  

class PostForm(FlaskForm):  
    title = StringField('Title', validators=[DataRequired()])  
    content = TextAreaField('Content', validators=[DataRequired()])  
    submit = SubmitField('Submit')  

@app.route('/create', methods=['GET', 'POST'])  
def create_post():  
    form = PostForm()  
    if form.validate_on_submit():  
        new_post = Post(title=form.title.data, content=form.content.data)  
        db.session.add(new_post)  
        db.session.commit()  
        return redirect(url_for('post_list'))  
    return render_template('create_post.html', form=form)  

6.2.3 模板文件 create_post.html

<form method="POST">  
    {{ form.hidden_tag() }}  
    {{ form.title.label }} {{ form.title() }}  
    {{ form.content.label }} {{ form.content() }}  
    {{ form.submit() }}  
</form>  

结论

Flask 通过简洁的设计和强大的扩展生态,为开发者提供了灵活的 Web 开发体验。掌握其核心概念(如路由、请求处理、模板引擎)是构建高质量应用的基础。无论是快速搭建原型,还是开发复杂系统,Flask 都能通过“微框架”的特性,帮助开发者高效完成任务。建议读者通过实践项目巩固知识,并逐步探索更多高级功能(如 REST API 设计、身份认证等)。


关键词布局

  • 标题中明确包含“Flask 基本概念”。
  • 正文通过“核心概念”“路由系统”“请求处理”等章节自然覆盖关键词。
  • 在扩展、实战案例等部分间接关联“Flask 基本概念”的应用场景。

最新发布