Flask 作为 Python 生态中最受欢迎的轻量级 Web 框架,以其简洁灵活的设计理念赢得了开发者的青睐。本文将系统梳理 Flask 的核心概念与实战技巧,帮助你快速掌握这一强大框架。

一、Flask 框架概述

1.1 轻量级框架的核心特性

Flask 诞生于 2010 年,由 Armin Ronacher 开发,基于 Werkzeug 工具箱和 Jinja2 模板引擎构建。其核心特性包括:

  • 微型内核设计:仅包含路由、请求 / 响应处理等核心功能
  • 扩展丰富:通过第三方扩展实现 ORM、认证、邮件等功能
  • WSGI 兼容:支持 Gunicorn、uWSGI 等生产环境服务器
  • 异步支持:2.0 版本后引入异步编程支持

1.2 与 Django 的框架对比

特性FlaskDjango
框架重量轻量级(需自行集成扩展)重量级(内置完整功能)
ORM需 Flask-SQLAlchemy 扩展内置 ORM
路由系统灵活的装饰器路由集中式 URL 配置
开发模式高度定制化约定大于配置
适合场景小型项目、API 服务大型复杂项目

二、快速入门:从环境搭建到第一个应用

2.1 环境准备与项目创建

# 创建虚拟环境
conda create -n flask python=3.9
conda activate flask# 安装Flask
pip install flask -i https://pypi.douban.com/simple

2.2 第一个 Flask 应用

# manage.py
from flask import Flaskapp = Flask(__name__)@app.route("/")
def index():return "<h1>Hello Flask!</h1>"if __name__ == '__main__':app.run(host="0.0.0.0", port=5000, debug=True)

2.3 路由系统详解

2.3.1 基础路由定义
@app.route("/user/<int:user_id>")
def user_detail(user_id):return f"用户ID: {user_id}"
2.3.2 路由参数转换器

Flask 内置多种参数转换器:

  • string:默认字符串类型(不包含斜杠)
  • int:整数类型
  • float:浮点数类型
  • path:包含斜杠的字符串
  • uuid:UUID 格式字符串
2.3.3 自定义正则路由
from werkzeug.routing import BaseConverterclass RegexConverter(BaseConverter):def __init__(self, url_map, regex):super().__init__(url_map)self.regex = regexapp.url_map.converters['re'] = RegexConverter@app.route("/phone/<re('1[3-9]\\d{9}'):phone>")
def send_sms(phone):return f"向{phone}发送短信"

三、请求与响应处理

3.1 请求数据获取

Flask 通过 request 对象封装请求数据:

from flask import request, jsonify@app.route("/api/data", methods=["POST"])
def process_data():# 获取查询参数query_param = request.args.get("key")# 获取表单数据form_data = request.form.get("username")# 获取JSON数据json_data = request.json# 获取文件上传if "file" in request.files:file = request.files["file"]file.save("./uploads/" + file.filename)return jsonify({"status": 200,"data": "处理成功"})

3.2 响应处理与状态码

from flask import make_response, redirect, url_for@app.route("/response")
def handle_response():# 简单字符串响应return "普通响应", 200# JSON响应return jsonify({"message": "JSON响应"})# 重定向响应return redirect(url_for("index"))# 自定义响应头response = make_response("自定义响应")response.headers["X-Company"] = "Flask教程"return response

四、会话控制与状态管理

4.1 Cookie 操作

from flask import make_response, request@app.route("/set-cookie")
def set_cookie():response = make_response("Cookie已设置")response.set_cookie("username", "xiaoming", max_age=3600)return response@app.route("/get-cookie")
def get_cookie():username = request.cookies.get("username")return f"获取到Cookie: {username}"

4.2 Session 管理

from flask import sessionapp.config["SECRET_KEY"] = "your_secret_key"  # 必须设置密钥@app.route("/login")
def login():session["user_id"] = 1001session["is_login"] = Truereturn "登录成功"@app.route("/profile")
def profile():if session.get("is_login"):return f"用户ID: {session.get('user_id')}"return "请先登录", 401

五、模板引擎与视图渲染

5.1 Jinja2 模板基础

<!-- templates/index.html -->
<!DOCTYPE html>
<html lang="zh-CN">
<head><title>{{ title }}</title>
</head>
<body><h1>{{ content }}</h1><ul>{% for item in data_list %}<li>{{ loop.index }}. {{ item.name }}</li>{% endfor %}</ul>
</body>
</html>
from flask import render_template@app.route("/template")
def render_template_demo():return render_template("index.html",title="Flask模板示例",content="欢迎使用Jinja2模板",data_list=[{"name": "项目1"}, {"name": "项目2"}])

5.2 模板过滤器与继承

# 自定义过滤器
@app.template_filter("mobile_mask")
def mask_mobile(mobile):return mobile[:3] + "****" + mobile[-4:]# 在模板中使用
{{ user.mobile | mobile_mask }}
<!-- 基础模板 base.html -->
<!DOCTYPE html>
<head><title>{% block title %}Flask应用{% endblock %}</title>{% block styles %}{% endblock %}
</head>
<body><header>网站头部导航</header><main>{% block content %}{% endblock %}</main><footer>版权信息</footer>
</body>
</html><!-- 子模板 -->
{% extends "base.html" %}
{% block title %}用户列表{% endblock %}
{% block content %}<h2>用户列表页面</h2><ul>{% for user in users %}<li>{{ user.name }}</li>{% endfor %}</ul>
{% endblock %}

六、数据库操作与 ORM

6.1 Flask-SQLAlchemy 配置

from flask_sqlalchemy import SQLAlchemyapp.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:123@localhost:3306/flask_demo"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["SQLALCHEMY_ECHO"] = True  # 开发环境显示SQL语句db = SQLAlchemy(app)

6.2 模型定义与 CRUD 操作

class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(50), unique=True)email = db.Column(db.String(100))posts = db.relationship("Post", backref="author", lazy="dynamic")class Post(db.Model):id = db.Column(db.Integer, primary_key=True)title = db.Column(db.String(100))content = db.Column(db.Text)user_id = db.Column(db.Integer, db.ForeignKey("user.id"))# 创建数据
user = User(username="xiaoming", email="xiaoming@example.com")
db.session.add(user)
db.session.commit()# 查询数据
all_users = User.query.all()
user_by_id = User.query.get(1)
users_by_email = User.query.filter_by(email="xiaoming@example.com").first()# 更新数据
user.username = "new_name"
db.session.commit()# 删除数据
db.session.delete(user)
db.session.commit()

6.3 复杂查询与关联关系

# 多条件查询
young_users = User.query.filter(User.age < 30,User.is_active == True
).order_by(User.id.desc()).all()# 连表查询
post_with_author = db.session.query(Post, User).join(User, Post.user_id == User.id
).filter(Post.id == 1).first()# 聚合查询
from sqlalchemy import funcuser_count = db.session.query(func.count(User.id)).scalar()
avg_age = db.session.query(func.avg(User.age)).scalar()

七、蓝图与项目模块化

7.1 蓝图创建与注册

# users/blueprint.py
from flask import Blueprintusers_bp = Blueprint("users", __name__, url_prefix="/users")@users_bp.route("/")
def list_users():return "用户列表"@users_bp.route("/<int:user_id>")
def user_detail(user_id):return f"用户详情: {user_id}"# 主应用注册蓝图
from users.blueprint import users_bpapp.register_blueprint(users_bp)

7.2 蓝图项目结构

project/
├── app/
│   ├── __init__.py
│   ├── models.py
│   ├── main/
│   │   ├── __init__.py
│   │   └── views.py
│   ├── users/
│   │   ├── __init__.py
│   │   ├── models.py
│   │   └── views.py
│   └── templates/
│       ├── base.html
│       ├── main/
│       │   └── index.html
│       └── users/
│           └── profile.html
├── manage.py
└── requirements.txt

八、请求钩子与异常处理

8.1 请求生命周期钩子

@app.before_first_request
def before_first_request():print("处理第一个请求前执行")@app.before_request
def before_request():print("每个请求前执行")# 可用于认证校验if not session.get("is_login") and request.path != "/login":return redirect("/login")@app.after_request
def after_request(response):print("请求处理后执行")response.headers["X-Processed-By"] = "Flask"return response@app.teardown_request
def teardown_request(exception):print("请求结束后执行")if exception:print(f"异常发生: {exception}")

8.2 异常处理机制

from flask import abort@app.route("/user/<int:user_id>")
def get_user(user_id):user = User.query.get(user_id)if not user:abort(404)  # 抛出404异常return f"用户: {user.username}"@app.errorhandler(404)
def page_not_found(e):return "页面未找到", 404@app.errorhandler(500)
def internal_server_error(e):return "服务器内部错误", 500

九、生产部署与最佳实践

9.1 部署方案

# 安装Gunicorn
pip install gunicorn# 启动命令
gunicorn -w 4 -b 0.0.0.0:8000 manage:app# 使用Nginx反向代理
server {listen 80;server_name your_domain.com;location / {proxy_pass http://127.0.0.1:8000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}

9.2 配置管理最佳实践

# config.py
class Config:SECRET_KEY = "default_secret_key"SQLALCHEMY_TRACK_MODIFICATIONS = Falseclass DevelopmentConfig(Config):DEBUG = TrueSQLALCHEMY_ECHO = Trueclass ProductionConfig(Config):DEBUG = FalseSQLALCHEMY_ECHO = False# 生产环境数据库配置# 加载配置
app.config.from_object("config.DevelopmentConfig")

十、常用扩展与生态工具

10.1 核心扩展推荐

  • Flask-SQLAlchemy:ORM 工具,简化数据库操作
  • Flask-Migrate:数据库迁移工具,支持模型变更追踪
  • Flask-Login:用户认证管理,处理登录状态
  • Flask-JWT-Extended:JWT 认证支持,适合 API 服务
  • Flask-Cors:跨域资源共享支持
  • Flask-Mail:邮件发送功能
  • Flask-Cache:缓存管理

10.2 开发工具推荐

  • Postman:API 调试工具
  • SQLAlchemy Shell:交互式 ORM 调试
  • Flask-DebugToolbar:开发调试工具栏
  • Gunicorn:生产环境 WSGI 服务器
  • Docker:容器化部署工具

Flask 的魅力在于其灵活性,开发者可以根据项目需求自由选择扩展,真正实现 "微核心、大生态" 的开发体验。在实际项目中,建议结合蓝图架构与测试驱动开发方法,打造可维护的高质量应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87321.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87321.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/87321.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python爬取豆瓣短评并生成词云分析

一、项目概述 本项目的目标是爬取豆瓣上某部电影的短评数据&#xff0c;并生成词云进行情感分析。我们将使用Python编程语言&#xff0c;借助爬虫技术获取数据&#xff0c;并利用自然语言处理和数据可视化工具进行分析。具体步骤包括&#xff1a; 爬取豆瓣短评数据。数据清洗…

Controller Area Network (CAN) 通信机制简介

目录 1. CAN 概述 2. 物理结构与传输机制 3. 消息格式与仲裁机制 4. 错误检测与总线状态 5. 工业用 CAN 接口 6. 本讲总结 1. CAN 概述 CAN&#xff08;Controller Area Network&#xff09;是由德国博世&#xff08;Bosch&#xff09;公司于 1983 年提出的串行通信协议…

我有一个想法

我有一个想法 我想为家乡做点事情&#xff0c;但是又不知道从哪里开始。 也许为家乡的教育做点事情是比较靠谱的。 于是&#xff0c;我就想到了&#xff0c;是不是可以在高中学校&#xff0c;设立一个“鸿鹄”奖学金&#xff1f; 这个奖学金怎么使用呢&#xff1f; 在每年9月份…

【Pandas】pandas DataFrame stack

Pandas2.2 DataFrame Reshaping sorting transposing 方法描述DataFrame.droplevel(level[, axis])用于**从 DataFrame 的索引&#xff08;行或列&#xff09;中删除指定层级&#xff08;level&#xff09;**的方法DataFrame.pivot(*, columns[, index, values])用于重塑 Dat…

Java 自动关闭资源语法糖 - try-with-resources

文章目录 Java 自动关闭资源语法糖 - try-with-resources前言优势1、自动资源管理2、处理多重资源3、异常处理更健壮4、适用条件 总结 Java 自动关闭资源语法糖 - try-with-resources 前言 日常开发中&#xff0c;我们经常会看到如下代码&#xff1a; try (InputStream is …

MyBatis中的动态SQL是什么?

大家好&#xff0c;我是锋哥。今天分享关于【MyBatis中的动态SQL是什么&#xff1f;】面试题。希望对大家有帮助&#xff1b; MyBatis中的动态SQL是什么&#xff1f; 超硬核AI学习资料&#xff0c;现在永久免费了&#xff01; MyBatis中的动态SQL指的是根据不同的条件&#x…

【Java反射】如何新增对象中的属性,与JavaScript中的直接添加属性有什么区别?

问&#xff1a; Object obj new Object(); //获取一个类的class对象 Class<?> objClass Object.class; try { //通过newInstance方法创建一个新的属性 Field newField Field.class.newInstance(); newField.setAccessible(true); newField.set(obj, “index”); }ca…

java spring boot Swagger安装及使用

https://springdoc.org/ 可能原因分析 &#x1f50d; 原因 1&#xff1a;SpringFox 版本与 Spring Boot 版本不兼容 ❌ SpringFox 3.0.0 不完全兼容 Spring Boot 2.6 及更高版本&#xff0c;可能导致 NullPointerException。 Spring Boot 3.x 完全不支持 SpringFox&#xff0c…

电商云仓/前置仓的物流高效监控、管理、预警系统,快递鸟DMS

在电商行业蓬勃发展的当下&#xff0c;电商云仓和前置仓作为物流配送体系的关键环节&#xff0c;其高效运作直接影响着消费者体验与企业竞争力。快递鸟 DMS 物流交付管理平台&#xff0c;以其卓越的物流监控、管理及预警功能&#xff0c;成为电商企业优化云仓和前置仓物流管理的…

HarmonyOS Next深度解析:高德定位SDK高效集成与实战指南

HarmoyOS Next 实现高德定位SDK 注&#xff1a;作者采用版本为 HarmonyOS 5.0.0 Release SDK和DevEco Studio 5.0.0 Release。 1.获取本地AppID&#xff1a; 在index.pages的abountToAppear( ) 方法中获取appID、并打印在Log日志&#xff0c;即可在程序运行时获取本地项目的…

【技术】记一次 Docker 中的 ES 数据迁移,使用 Reindex API

记一次 Docker 中的 ES 数据迁移&#xff0c;使用 Reindex API 环境背景需求背景开始迁移确认老 ES 的访问地址在新 ES 中创建索引的 Mapping (选配)在新 ES 中配置老 ES 的地址开始迁移数据数据验证 首先声明&#xff0c;是因为环境限制&#xff0c;没有办法使用同步工具&…

yii2基础版本安装记录,实录有点乱看标题即可

因为使用php 安装的是docker环境所有进入到容器安装ridh_mfe_api 为挂载目录 Nginx及PHP挂载配置 因为使用php 安装的是docker环境所有进入到容器安装 ridh_mfe_api 为挂载目录 进入容器 % docker exec -it php sh /var/www/html # ls index.html index.php composer crea…

前端跨域解决方案(3):CORS

1 CORS 核心 CORS&#xff08;Cross-Origin Resource Sharing&#xff09;&#xff0c;即跨域资源共享&#xff0c;是目前最主流的跨域方案&#xff0c;它通过服务器返回的特殊 HTTP 头&#xff0c;允许浏览器放行跨域请求。与传统的 JSONP 相比&#xff0c;CORS 具有明显的优…

SpringBoot源码解析(十五):spring-boot-autoconfigure.jar的模块化设计

前言 SpringBoot的自动配置是其革命性特性的核心&#xff0c;而spring-boot-autoconfigure.jar则是这一机制的物理载体。本文将深入剖析这个JAR包的模块化设计哲学&#xff0c;从包结构划分、条件注解体系到自动配置加载机制&#xff0c;全方位解析SpringBoot如何通过精妙的模…

学习笔记九:docker容器日志问题

docker容器日志问题 背景如何处理日志问题主要通过日志轮询方式处理。修改 Docker 配置日志快速清理 背景 Docker 默认使用的是 json-file 日志驱动。日志会一直写&#xff0c;一直写&#xff0c;没有限制、没有轮转、没有清理&#xff01; 日志默认位置&#xff1a; /var/lib…

低成本同屏方案:电脑 + 路由器实现 50 台安卓平板实时同屏

引言 在教育机构、小型培训场景或企业简易会议中&#xff0c;常面临以最低成本实现多设备同屏的需求。本文针对 "电脑 路由器 50 台安卓平板" 的极简硬件组合&#xff0c;详细剖析实时同屏的实现路径&#xff0c;从问题分析到技术落地提供全流程解决方案&#xff0…

Unity ECS DOTS技术实现50000个cube随机循环移动流程

前言 之前使用过ECS面向组件开发&#xff0c;一直想试一下Unity的ECS DOTS技术&#xff0c;但是苦于入门门槛太高&#xff0c;下载官方的Demo&#xff0c;发现代码哪哪儿都看不懂&#xff0c;一大堆API闻所未闻&#xff0c;而且没有一个入门的流程&#xff0c;导致无法进行下去…

设计模式精讲 Day 3:抽象工厂模式(Abstract Factory Pattern)

【设计模式精讲 Day 3】抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09; 文章简述 在软件开发中&#xff0c;随着业务复杂度的提升&#xff0c;系统需要支持多种产品族的创建。抽象工厂模式正是为了解决这一问题而诞生的设计模式之一。本文作为“设计模式精讲”…

Kafka消息零丢失架构设计:从原理到实战的全方位保障

引言 在构建高可靠分布式系统时&#xff0c;Kafka作为核心消息中间件被广泛应用于数据管道、实时流处理等关键场景。然而&#xff0c;分布式环境下的网络波动、节点故障等因素可能导致消息丢失&#xff0c;如何确保Kafka实现端到端的消息零丢失成为架构设计的关键挑战。本文将…

Python学习笔记:错误和异常处理

1. 什么是错误和异常 在Python中&#xff0c;错误可以分为两类&#xff1a; 语法错误(Syntax Errors)&#xff1a;代码不符合Python语法规则异常(Exceptions)&#xff1a;语法正确的代码在运行时发生的错误 # 语法错误示例 print("Hello World" # 缺少右括号# 异…