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 扩展的使用流程
- 安装扩展:通过 pip 安装。
pip install flask-sqlalchemy
- 初始化扩展:将扩展对象绑定到应用实例。
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() db.init_app(app)
- 使用扩展功能:例如定义数据库模型。
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 基本概念”的应用场景。