当前位置: 首页 > news >正文

Flask 路由装饰器:从 URL 到视图函数的优雅映射

前置知识,关于Python装饰器的语法,链接:Python 装饰器:从“语法糖”到“代码神器”的深度解析

1、路由装饰器的功能:给 URL 贴 “功能标签”

在 Flask 开发中,你一定见过这样的代码:

from flask import Flask  
app = Flask(__name__)  @app.route('/')  
def index():  return "Hello, Flask!"  

这里的 @app.route('/') 就是 Flask 的路由装饰器,它的核心功能是:将特定的 URL 与处理该 URL 的视图函数绑定。

简单来说,它告诉 Flask:“当用户访问 '/' 路径时,执行 index 函数并返回结果。”

通过这一“贴标签”操作,开发者无需手动维护复杂的 URL 映射表,只需用装饰器标记每个视图函数对应的路径,Flask 就能自动完成 URL 到视图函数的匹配。


2、路由装饰器的核心机制:从 @app.routeurl_map 的全流程

路由装饰器的底层实现依赖 Flask 的路由注册与匹配系统,核心流程分为 注册阶段请求处理阶段

2.1 注册阶段:@app.route 如何绑定 URL 与视图?

@app.route 本质是一个语法糖,其底层通过调用 app.add_url_rule() 完成路由规则的注册。

关键步骤:
  1. @app.route(rule, **options) 触发注册
    当用 @app.route('/') 装饰视图函数 index 时,Flask 会自动执行以下逻辑:

    app.add_url_rule(  rule='/',  # URL 路径(必填)  endpoint='index',  # 路由端点(默认使用视图函数名)  view_func=index,  # 绑定的视图函数(必填)  **options  # 其他参数(如 methods、strict_slashes 等)  
    )  
    
  2. 创建 Rule 对象并存储到 url_map
    add_url_rule 会生成一个 Rule 对象(包含 URL 路径、支持的 HTTP 方法、参数解析规则等关键信息),并将其添加到 app.url_map(Flask 应用的路由规则总仓库,负责管理所有注册的 Rule)中。

2.2 请求处理阶段:url_map 如何匹配 URL?

当用户发起请求(如访问 http://域名/),Flask 的处理流程如下:

关键步骤:
  1. 构建请求上下文:Flask 根据请求的 URL、方法等信息,生成 request 对象。

  2. url_map 匹配规则
    url_map 通过 match() 方法匹配请求的 URL,找到对应的 Rule 对象。匹配逻辑包括:

    • 静态路径直接匹配(如 /about 对应 Rule(rule='/about'))。
    • 动态参数解析(如 /user/alice 匹配 Rule(rule='/user/<username>'),提取 username='alice')。
  3. 触发视图函数执行
    匹配到 Rule 后,Flask 从 Rule 中获取绑定的 view_func(视图函数),并将解析出的参数(如 username)传递给视图函数执行,最终将返回值作为响应返回给用户。


3、路由装饰器的典型应用场景

3.1、基本路由:静态路径与视图绑定

为固定 URL 路径定义视图函数,访问对应路径返回固定内容:

@app.route('/about')  
def about():  return "关于我们"  @app.route('/contact')  
def contact():  return "联系我们"  

3.2、动态路由:捕获 URL 中的参数

通过 <参数> 语法捕获 URL 中的动态部分(如用户 ID、文章标题),常用于详情页或 API 接口。

支持参数默认值,使同一视图函数处理多种路径:

# 带默认值的动态路由(默认页为第1页)  
@app.route('/page', defaults={'page': 1})  
@app.route('/page/<int:page>')  
def show_page(page):  return f"第 {page} 页内容"  # 用户详情页(动态用户名)  
@app.route('/user/<username>')  
def user_profile(username):  return f"用户 {username} 的个人页面"  # API 接口(整数类型的文章 ID)  
@app.route('/api/post/<int:post_id>')  
def get_post(post_id):  data = db.query(Post).filter_by(id=post_id).first()  return jsonify(data.to_dict())  

3.3、支持多种 HTTP 方法

通过 methods 参数指定路由响应的请求方法(如 GETPOST),适配表单提交、API 接口等场景:

from flask import request  @app.route('/login', methods=['GET', 'POST'])  
def login():  if request.method == 'POST':  # 处理登录表单提交(用户名/密码验证)  return redirect(url_for('user_profile', username=username))  return render_template('login.html')  # GET 请求返回登录表单  

3.4、蓝图(Blueprints):按模块拆分大型项目路由

在大型 Flask 项目中,若所有路由都直接写在主应用文件(如 app.py)中,代码会变得臃肿且难以维护。
蓝图(Blueprints)是 Flask 提供的“模块化工具”,允许将路由按功能模块(如用户、商品、订单)拆分到不同文件中,实现代码的解耦与复用。


下面以具体示例来讲解,假设我们有一个电商项目,包含用户模块商品模块,可以通过蓝图将它们的路由分开管理:

步骤1:创建用户模块蓝图(user_bp)
user/views.py 文件中定义用户相关路由:

# user/views.py  
from flask import Blueprint, render_template, request  # 创建用户模块蓝图,路径前缀为 /user  
user_bp = Blueprint('user', __name__, url_prefix='/user')  @user_bp.route('/register', methods=['GET', 'POST'])  # 实际路径:/user/register  
def register():  if request.method == 'POST':  # 处理用户注册表单提交(数据库写入等逻辑)  return "注册成功"  return render_template('user/register.html')  # GET 请求返回注册页面  @user_bp.route('/login')  # 实际路径:/user/login  
def login():  return render_template('user/login.html')  # 用户登录页面  

步骤2:创建商品模块蓝图(product_bp)
product/views.py 文件中定义商品相关路由:

# product/views.py  
from flask import Blueprint, jsonify  
from models import Product  # 假设 Product 是数据库模型  # 创建商品模块蓝图,路径前缀为 /product  
product_bp = Blueprint('product', __name__, url_prefix='/product')  @product_bp.route('/list')  # 实际路径:/product/list  
def product_list():  # 查询数据库获取商品列表  products = Product.query.all()  return jsonify([p.to_dict() for p in products])  # 返回 JSON 格式的商品数据  @product_bp.route('/detail/<int:product_id>')  # 实际路径:/product/detail/123  
def product_detail(product_id):  # 根据 ID 查询商品详情  product = Product.query.get_or_404(product_id)  return jsonify(product.to_dict())  

步骤3:主应用注册蓝图
在主文件 app.py 中注册所有蓝图,将模块路由整合到应用中:

# app.py  
from flask import Flask  
from user.views import user_bp  # 导入用户模块蓝图  
from product.views import product_bp  # 导入商品模块蓝图  app = Flask(__name__)  # 注册用户模块蓝图(路径前缀 /user)  
app.register_blueprint(user_bp)  # 注册商品模块蓝图(路径前缀 /product)  
app.register_blueprint(product_bp)  if __name__ == '__main__':  app.run()  

4、进阶技巧:细粒度控制路由行为

4.1、自定义 URL 转换器

突破 Flask 内置参数类型(intstring 等)的限制,通过自定义转换器支持正则匹配、日期解析等复杂需求:

from werkzeug.routing import BaseConverter  class RegexConverter(BaseConverter):  def __init__(self, url_map, regex):  super().__init__(url_map)  self.regex = regex  # 接收正则表达式参数  # 注册自定义转换器(名称为 regex)  
app.url_map.converters['regex'] = RegexConverter  # 使用示例:匹配手机号格式(1开头+10位数字)  
@app.route('/phone/<regex("1[3-9]\\d{9}"):phone_num>')  
def validate_phone(phone_num):  return f"手机号:{phone_num}"  

4.2、子域名匹配

通过 subdomain 参数实现子域名与主域名的路由隔离(需配置 SERVER_NAME):

app.config['SERVER_NAME'] = 'example.com:5000'  # 配置域名和端口  @app.route('/', subdomain='blog')  # 匹配 blog.example.com:5000/  
def blog_index():  return "博客首页"  @app.route('/', subdomain='www')  # 匹配 www.example.com:5000/  
def www_index():  return "网站首页"  

5、注意事项:避开路由陷阱

5.1、URL 末尾斜杠规则

  • 带斜杠路径(如 /projects/):类似文件夹,访问 /projects 会自动重定向到 /projects/(避免 404)。
  • 无斜杠路径(如 /about):严格匹配,访问 /about/ 会返回 404(适合表示唯一资源,如文件)。

5.2、路由顺序影响匹配结果

Flask 按路由定义的顺序匹配 URL,更具体的路径应放在前面。例如:

# 正确顺序:先匹配 /user/me,再匹配通用的 /user/<username>  
@app.route('/user/me')  
def user_me():  return "当前用户"  @app.route('/user/<username>')  
def user_profile(username):  return f"用户 {username}"  # 错误顺序:/user/me 会被错误匹配为 username='me'  

5.3、性能:路由匹配效率

Flask 使用 Werkzeug 的 Map 进行路由匹配,性能足够应对大多数场景。优化建议:

  • 高频访问的路由(如首页)放在前面。
  • 避免使用复杂的正则表达式参数(可能降低匹配效率)。

相关文章:

Flask 路由装饰器:从 URL 到视图函数的优雅映射

前置知识&#xff0c;关于Python装饰器的语法&#xff0c;链接&#xff1a;Python 装饰器&#xff1a;从“语法糖”到“代码神器”的深度解析 1、路由装饰器的功能&#xff1a;给 URL 贴 “功能标签” 在 Flask 开发中&#xff0c;你一定见过这样的代码&#xff1a; from fla…...

动态规划3、悟到核心

题目引入&#xff1a; #include <iostream> #include <queue> #include <vector> #include <tuple> #include <algorithm> #include <cstring> using namespace std;// dp[i]考虑前i家店能收获的最大价值 // 面对第i家店铺&#xff0c;你可…...

VLM-MPC:自动驾驶中模型预测控制器增强视觉-语言模型

《VLM-MPC: Model Predictive Controller Augmented Vision Language Model for Autonomous Driving》2024年8月发表&#xff0c;来自威斯康星大学的论文。 受视觉语言模型&#xff08;VLM&#xff09;的紧急推理能力及其提高自动驾驶系统可理解性的潜力的启发&#xff0c;本文…...

HTTP/HTTPS 协议浅解

文章目录 一、HTTP 协议&#xff08;一&#xff09;定义&#xff08;二&#xff09;特点&#xff08;三&#xff09;应用场景&#xff08;四&#xff09;优势&#xff08;五&#xff09;劣势 二、HTTPS 协议&#xff08;一&#xff09;定义&#xff08;二&#xff09;特点&…...

Ajax快速入门教程

输入java时&#xff0c;页面并没有刷新但是下面自动联想出了跟java有关的东西&#xff0c;像这种就叫异步交互 它不会妨碍你的输入&#xff0c;同时还能够同步进行对于java相关联想词的推送 发送异步请求需要借助工具axios 引入axios&#xff0c;可以直接在scripts中引入 get和…...

如何在Java中处理PDF文档(教程)

在开发文档管理系统、自动化工具或商业应用程序时&#xff0c;Java开发者常需处理PDF文档的编辑需求。无论是添加页面、调整内容尺寸、插入水印还是添加注释&#xff0c;选择一套可靠易用的Java PDF开发工具包至关重要。 JPedal&#xff08;Java PDF开发工具包&#xff09;的新…...

springcloud集成seata报错Error creating bean with name ‘globalTransactionScanner‘

1. pom文件引入依赖 <!-- seata --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency> 2. 报错 3. 在启动配置中添加一行配置: --add-opensjava.base/j…...

使用 OpenCV 实现哈哈镜效果:让图像“扭曲起来”!

在计算机视觉和图像处理领域&#xff0c;OpenCV 提供了非常强大的图像几何变换能力&#xff0c;不仅可以用于纠正图像&#xff0c;还能制造各种“有趣”的视觉效果。今天&#xff0c;我们就来实现一个经典的“哈哈镜”效果&#xff0c;让图像像在游乐园里一样被拉伸、压缩、扭曲…...

pikachu靶场 暴力破解

学习中参考的博客如下 pikachu靶场暴力破解专题-CSDN博客 1&#xff0c;基于表单的暴力破解 出现了一个登录页面 解题步骤&#xff1a;抓包&#xff0c;发到bp里&#xff0c;右键发到Intruder&#xff0c;因为有两个位置要爆破&#xff0c;所以选择集群炸弹攻击&#xff…...

鸿蒙开发:应用上架第三篇,配置签名信息打出上架包

前言 本文基于Api13 经过前面两篇文章&#xff0c;我们获取到了密钥和证书请求文件以及最终的发布证书和发布证书Profile文件&#xff0c;可以说&#xff0c;所有的签名信息文件&#xff0c;我们都已经完成了&#xff0c;正所谓&#xff0c;万事俱备只欠东风&#xff0c;这篇文…...

基于R语言的贝叶斯网络模型实践技术应用:开启科研新视角

在现代科研领域&#xff0c;变量间的因果关系推断是生态学、环境科学、医学等多学科研究的核心问题。然而&#xff0c;传统的统计学方法往往只能揭示变量间的相关关系&#xff0c;而非因果关系。贝叶斯网络作为一种结合图论与统计学理论的新型模型&#xff0c;不仅能够统合多种…...

第五章 GPT模块配置

由于GPT配置需要和Irq和Mcu进行配合设置(GPT可以由芯片外设中的GTM和GPT12实现,这次是以GTM为实现)。 1 GTM外设时钟配置 首先需要对MCU组件进行配置,配置GTM的时钟,需要参照GTM的CMU时钟树。 下图时钟树的CLS0_CLK为MCU(McuClockSettingConfig_0中的 McuSTMFrequency )f…...

虚拟机NAT模式获取不到ip

虚拟机NAT模式获取不到ip 如图所示 解决方案&#xff1a; 先查看NetworkManager是否启动 systemctl status NetworkManager如果没启动就启动一遍 使用DHCP手动获取一遍ip sudo dhclient ens33成功得到ip 这是后遇到了另一个问题&#xff0c;ip释放后&#xff0c;不能自动…...

Docker的网络介绍

网络简单介绍 在介绍 Docker 的网络模式之前&#xff0c;先简单说下我们在使用 Vmware 虚拟机中的网络模式&#xff0c;形成对比&#xff0c;更好理解。 1、Vmware 中的网络模式 1.1、VMnet0&#xff08;桥接模式&#xff09; 虚拟机通过宿主机的物理网卡直接连接到外部网络…...

Nginx负载均衡配置详解

在Nginx中配置负载均衡主要通过 upstream 模块实现,结合反向代理将请求分发到多个后端服务器。以下是详细配置步骤和案例解析: 一、基础配置 1. 配置语法 http {upstream backend_servers {# 负载均衡策略server backend1.example.com;server backend2.example.com;server …...

关于 Web 漏洞原理与利用:4. 文件上传漏洞

定义&#xff1a;文件上传漏洞是指应用程序允许用户上传文件&#xff0c;但没有严格校验上传文件的类型、内容、路径等属性&#xff0c;导致攻击者可以上传并执行恶意代码。 绕过方式&#xff1a; 前端绕过 1. 前端限制的原理 前端限制上传文件类型的常见方式有三种&#xf…...

(6)python爬虫--selenium

文章目录 前言一、初识selenium二、安装selenium2.1 查看chrome版本并禁止chrome自动更新2.1.1 查看chrome版本2.1.2 禁止chrome更新自动更新 2.2 安装对应版本的驱动程序2.3安装selenium包 三、selenium关于浏览器的使用3.1 创建浏览器、设置、打开3.2 打开/关闭网页及浏览器3…...

MCU 上电不启动的常见原因分析与排查思路

在开发过程中&#xff0c;“MCU 上电不运行”是我们经常遇到的问题之一。但客户对此类问题的描述往往较为模糊&#xff0c;仅简单表示“产品不工作”或“怀疑 MCU 没有运行”&#xff0c;这给我们现场排查带来了较大的挑战。即便工程师到达现场&#xff0c;往往也无法迅速定位问…...

Spark Core 源码关键环节的深度解析

以下是对 Spark Core 源码关键环节的深度解析&#xff0c;包括核心组件启动与调度机制、Shuffle与调度系统、RDD高级机制。每个环节都细化到具体方法、逻辑、源码片段&#xff0c;附有流程图思路与速记口诀&#xff0c;便于记忆和理解。 一、核心组件启动与调度机制 1. RpcEnv…...

net Core》》包与库 LibMan、NPM

LibMan 资料 NPM 资料 在 Visual Studio 中使用 npm package.json 保存之后 vs会自动下载的。 注意&#xff1a;如果您没有看到 node_modules 文件夹&#xff0c;请确保在 Visual Studio 解决方案资源管理器中启用了“显示所有文件”选项 要卸载该库&#xff0c;您只需从 …...

数学建模,机器决策人建模

目录 数学建模 微分方程 动态系统建模 时间序列分析 概述 指数衰减 随机漂移 总结 曲线拟合 最优化方法 梯度下降法 概率建模&#xff08;如贝叶斯建模、马尔可夫过程、MDP/POMDP&#xff09; 等 贝叶斯建模 贝叶斯定理 优势 马尔可夫过程 马尔可夫过程的分类…...

FFmpeg中使用Android Content协议打开文件设备

引言 随着Android 10引入的Scoped Storage&#xff08;分区存储&#xff09;机制&#xff0c;传统的文件访问方式发生了重大变化。FFmpeg作为强大的多媒体处理工具&#xff0c;也在不断适应Android平台的演进。本文将介绍如何在FFmpeg 7.0版本中使用Android content协议直接访…...

SQL查询, 响应体临时字段报: Unknown column ‘data_json_map‘ in ‘field list‘

Overridepublic AjaxResult list(AgentPageReqVO pageReqVO, Integer pageNo, Integer pageSize) {// 1. 查询数据库获取代理列表List<AgentDO> list agentMapper.selectPage(pageReqVO).getList();// 如果结果为空&#xff0c;直接返回空分页结果if (CollectionUtils.i…...

OpenCv高阶(十四)——LBPH人脸识别

文章目录 前言一、LBPH原理1. LBP&#xff08;局部二值模式&#xff09;特征提取2. 图像分块处理3. 生成直方图4. 人脸识别&#xff08;匹配阶段&#xff09;5. LBPH的特点6. 变种与优化 二、LBPH人脸识别简单实现&#xff08;一&#xff09;LBPH人脸识别1、图像读取&#xff0…...

C#开发利器:SharpBoxesCore全解析

SharpBoxesCore 是一个基于 C# 的开源开发工具库&#xff0c;旨在为开发者提供一系列常用功能模块和辅助类&#xff0c;以提高开发效率、减少重复代码编写&#xff0c;并增强项目的可维护性和扩展性。该库集成了多种实用工具类和通用扩展方法&#xff0c;适用于桌面应用、Web 项…...

回表是数据库概念,还是mysql的概念?

主键索引没有列&#xff0c;根据耳机索引去查主键索引&#xff0c;又没有查表&#xff0c;为啥叫回表呢&#xff1f; “回表”这个词&#xff0c;其实算是数据库里的一个通用概念&#xff0c;不过它最常见的应用场景是在 MySQL 的 InnoDB 引擎里&#xff0c;所以很多人一提起回…...

49、c# 能⽤foreach 遍历访问的对象需满足什么条件?

在 C# 中&#xff0c;要使用 foreach 循环遍历一个对象&#xff0c;该对象必须满足以下条件之一&#xff1a; 1. 实现 IEnumerable 或 IEnumerable 接口 非泛型版本&#xff1a;System.Collections.IEnumerable public class MyCollection : IEnumerable {private int[] _da…...

DL00987-基于深度学习YOLOv11的红外鸟类目标检测含完整数据集

提升科研能力&#xff0c;精准识别红外鸟类目标&#xff01; 完整代码数据集见文末 针对科研人员&#xff0c;尤其是研究生们&#xff0c;是否在鸟类目标检测中遇到过数据不够精准、处理困难等问题&#xff1f;现在&#xff0c;我们为你提供一款基于深度学习YOLOv11的红外鸟类…...

07 接口自动化-用例管理框架之pytest单元测试框架

文章目录 一、pytest用例管理框架&#xff08;单元测试框架&#xff09;二、pytest简介三、pytest的最基本的测试用例的规则四、运行方式1.主函数方式2.命令行方式3.通过pytest.ini的配置文件运行 五、pytest 默认执行测试用例的顺序六、跳过测试用例1.无条件跳过 pytest.mark.…...

Flutter 中 build 方法为何写在 StatefulWidget 的 State 类中

Flutter 中 build 方法为何写在 StatefulWidget 的 State 类中 在 Flutter 中&#xff0c;build 方法被设计在 StatefulWidget 的 State 类中而非 StatefulWidget 类本身&#xff0c;这种设计基于几个重要的架构原则和实际考量&#xff1a; 1. 核心设计原因 1.1 生命周期管理…...

多技术栈 iOS 项目的性能调试实战:从 Flutter 到 Unity(含 KeyMob 工具实测)

多技术栈 iOS 项目的性能调试实战&#xff1a;从 Flutter 到 Unity 随着移动端开发日趋多元化&#xff0c;iOS 项目中纯 Objective-C/Swift 已不再是唯一选择。越来越多团队采用 Flutter、React Native、Unity、WebView 混合等方案构建 App。这种“技术栈混合”带来灵活性的同…...

Base64加密解密

Base64 是一种基于 64 个可打印字符来表示二进制数据的编码方式&#xff0c;常用于需要通过文本协议传输二进制数据的场景&#xff08;如 URL、邮件&#xff09;。以下是不同场景下生成 Base64 编码的方法&#xff1a; 一、编程语言实现 Python import base64# 字符串转Base…...

程序设计基础----排序(2)

1、冒泡排序 #include <stdio.h>#define N 1000 int arr[N];/* 对长度为n的数组arr执行冒泡排序 */ void bubbleSort(int arr[], int n);/* 打印长度为n的数组arr */ void printArray(int arr[], int n);void swap(int *xp, int *yp) {int temp *xp;*xp *yp;*yp temp…...

C++:vector容器

vector容器与array容器相似&#xff0c;但vector容器是动态的&#xff0c;可以自动扩容。 使用方法和一些注意如下&#xff1a; #include<iostream> #include<vector> using namespace std;int main() {vector<char> vec { a,b,c,d };vec[4] e;//不能以此…...

十四、Hive 视图 Lateral View

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月20日 专栏&#xff1a;Hive教程 在Hive中&#xff0c;我们经常需要以不同于原始表结构的方式查看或处理数据。为了简化复杂查询、提供数据抽象&#xff0c;以及处理复杂数据类型&#xff08;如数组或Map&#xff09;&#…...

Frp Dockr Mysql内网映射

用 FRP 远程暴露 Mac mini 上的 Docker-MySQL&#xff08;含 Ubuntu frps 安装和 macOS 客户端配置&#xff09; 一、环境说明 服务器&#xff08;公网&#xff09;&#xff1a;Ubuntu 22.04 frps内网设备&#xff1a;macOS (Mac mini) frpc Docker MySQL目标&#xff1a;…...

PHP 扇形的面积(Area of a Circular Sector)

圆形扇区或圆形扇区是圆盘上由两个半径和一个圆弧围成的部分&#xff0c;其中较小的区域称为小扇区&#xff0c;较大的区域称为大扇区。让我们看看这个图&#xff0c;试着找出扇区&#xff1a; 在该图中&#xff0c;绿色阴影部分是扇形&#xff0c;“r”是半径&#xff0c;“th…...

物业后勤小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的物业后勤小程序源码&#xff0c;它为物业管理提供了高效便捷的解决方案。 该源码功能丰富&#xff0c;涵盖房屋认证、家人认证&#xff0c;保障社区居住安全&#xff1b;支持报事报修、装修申请&#xff0c;方便业主与物业沟通&#xff1b;还…...

git基础操作

当远程仓库迁移到一个新的组下面时&#xff0c;你需要在本地仓库中更新远程仓库的URL&#xff0c;以便与新的远程仓库关联。以下是详细步骤&#xff1a; 获取新的远程仓库URL&#xff1a; 首先&#xff0c;你需要从GitLab或相关平台获取新组下的仓库的新URL。通常&#xff0c;仓…...

鸿蒙HarmonyOS 【ArkTS组件】通用属性-背景设置

&#x1f4d1;往期推文全新看点&#xff08;附带最新鸿蒙全栈学习笔记&#xff09; 嵌入式开发适不适合做鸿蒙南向开发&#xff1f;看完这篇你就了解了~ 鸿蒙岗位需求突增&#xff01;移动端、PC端、IoT到底该怎么选&#xff1f; 分享一场鸿蒙开发面试经验记录&#xff08;三面…...

java 在用redis 的时候,如何合理的处理分页问题? redis应当如何存储性能最佳

在 Java 中使用 Redis 处理用户表分页时&#xff0c;需结合其数据结构特性优化存储和查询 1. 数据结构设计 场景需求 用户表字段&#xff1a;id, name, age, register_time&#xff08;注册时间&#xff09;分页要求&#xff1a;按注册时间倒序分页展示&#xff0c;每页 10 条…...

分类预测 | Matlab实现PNN概率神经网络多特征分类预测

分类预测 | Matlab实现PNN概率神经网络多特征分类预测 目录 分类预测 | Matlab实现PNN概率神经网络多特征分类预测分类效果代码功能算法流程程序设计参考资料分类效果 代码功能 该代码实现了一个基于**概率神经网络(PNN)**的多分类任务,核心功能如下: 数据预处理 读取Exce…...

spring-retry

学习链接 【SpringBoot】spring-retry(重试机制) 【Spring】Spring Retry CSDN有点可恶啊&#xff0c;拿着别人的文章&#xff0c;要开VIP才能看...

RTMP协议解析【二】

文章目录 RTMP协议解析【二】RTMP消息消息的格式Basic HeaderMessage HeaderExtended Timestamp RTMP协议解析【二】 本专栏重点负责介绍RTMP协议的理论部分&#xff0c; 跳过定义&#xff0c;协议与其他协议的优缺点对比&#xff0c;协议的拓展与改进&#xff0c;协议的历史发…...

WebGL2混合与雾

混合技术 一、混合基本技术 混合技术就是将两个片元调和&#xff0c;主要通过各种测试将准备进入帧缓冲&#xff08;源片元&#xff09;与帧缓冲中原有片元&#xff08;目标片元&#xff09;按照设定的比例加权计算出最终片元的颜色值 。 两种常用 组合 &#xff1a; 源因子…...

Windows Docker笔记-扩展

docker扩展知识点 开放容器端口 背景&#xff0c;有一个docker Centos7镜像&#xff0c;运行容器后&#xff0c;想要通过22端口远程这个容器 创建容器时开放映射端口&#xff0c;将容器的22端口映射到本地的22端口 docker run -p <宿主机端口>:<容器端口> 镜像名…...

【C++ Primer 学习札记】智能指针

1&#xff09;std::unique_ptr&#xff08;独占所有权&#xff09; 特点&#xff1a; 独占资源的所有权&#xff0c;同一时间只能有一个 unique_ptr 指向特定对象。 不可复制&#xff0c;但可以通过 std::move 转移所有权。 轻量级&#xff0c;几乎无额外开销&#xff08;与…...

【嵌入式人工智能产品开发实战】(二十二)—— 政安晨:改造小智AI开发智能体硬件(案例:移植PowerManager后麦克风不工作)

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 目录 确定你硬件的关键点 案例分析 &#x1f50d; 一、关键代码分析 ✅ 1. power_save_…...

Taro Error: chunk common [mini-css-extract-plugin]

目录 一、问题描述 二、解决方案 一、问题描述 taro项目编译时抛出一下异常&#xff1a; Error: chunk common [mini-css-extract-plugin] Conflicting order. Following module has been added: * css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[4].oneOf…...

【深度学习】多目标融合算法(六):渐进式分层提取模型PLE(Progressive Layered Extraction)

目录 一、引言 二、PLE&#xff08;Progressive Layered Extraction&#xff0c;渐进式分层提取模型&#xff09; 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 2.3.1 业务场景与建模 2.3.2 模型代码实现 2.3.3 模型训练与推理测试 2.3.4 打印模型结构 三、总结 一…...