Python flask入门

Python flask入门

  • 一、路由
    • 1.1 常规路由
    • 1.2 动态路由
    • 1.3 路由的其他高级用法
  • 二、变量规则
    • 2.1 示例1:字符串类型(默认)
    • 2.2 示例2:整数类型
    • 2.3 示例3:路径类型
  • 三、自定义转换器
    • 3.1 核心组件详解
    • 3.2 工作流程详解
  • 四、form表单
    • 4.1 表单的三大组成部分
  • 五、request请求
  • 六、重定向
  • 七、abort函数
  • 八、综合板块
    • 1、前后端数据交互
      • 1.1、通信基础
      • 1.2、后端代码
      • 1.3、前端代码
    • 2、javascript中的 fetch API和 $.ajax API

在了解Flask框架之前,强烈建议跟着官网教程及说明进行学习:https://dormousehole.readthedocs.io/en/latest/tutorial/layout.html

一、路由

1.1 常规路由

@app.route('/')这是一个 装饰器(Decorator),用于将 URL 路径与 Python 函数绑定。'/' 代表 根路径(主页),例如访问 http://localhost:5000/ 时会触发 hello() 函数,hello() 函数又会返回 ‘Hello, World!’,浏览器会显示该字符串。
@app.route('/first')定义路由 /first,访问 http://localhost:5000/first 时会调用 first() 函数,first() 函数又会返回 ‘first路由’,浏览器会显示该字符串。

当用户访问某个 URL(如 / 或 /first),Flask 会查找匹配的路由,并执行对应的函数。
函数的返回值(字符串、HTML、JSON 等)会作为 HTTP 响应返回给浏览器。

from flask import Flask
# 从flask库中导入Flask类函数
app = Flask(__name__)
# 既然Flask是类函数,那就要实例化,app就是实例化的对象。其中__name__ 是一个 Python 特殊变量,表示当前模块的名称。
@app.route('/')
# 1、这是一个装饰器(decorator),是 Python 的一个特殊语法。
# 2、@app.route() 装饰器将 URL 路径与下面的函数(def)绑定在一起。
# 3、此代码中:'/' 表示网站的根路径(即主页),当代码运行时,会调用hello函数。
# 4、@app.route('/')就是路由。
def hello():return 'Hello, World!'
@app.route('/first')
# 1、此处定义了first路由,装饰器地址与定义的函数一致
# 2、当页面加载first url时,会调用first函数
def first():return 'first路由'if __name__=='__main__':app.run()
# app.run() 是 Flask 提供的 开发服务器启动方法,主要功能包括:
# 1、启动一个本地 Web 服务器(默认地址:http://127.0.0.1:5000/)。
# 2、监听 HTTP 请求,并根据定义的路由(@app.route)调用对应的函数。
# 3、提供调试信息(如访问日志、错误提示等)。

1.2 动态路由

(1) 默认字符串类型 <variable>
(2) 整数类型 <int:variable>
(3) 浮点数类型 <float:variable>

@app.route('/user/<id>')
def index(id):if id == '1':return '返回 1'if id == str(2):return '返回 str(2)'
# 1、访问 /user/1 → 返回 '返回 1'
# 2、访问 /user/2 → 返回 '返回 str(2)'
# 3、访问 /user/abc → 无匹配条件,返回空响应(可优化)# (1) 默认字符串类型 <variable>
@app.route('/user/<username>')
def show_user(username):return f'用户名: {username}'
# 1、/user/alice → 用户名: alice
# 2、/user/123 → 用户名: 123# (2) 整数类型 <int:variable>
@app.route('/post/<int:post_id>')
def show_post(post_id):  # post_id 是整数return f'文章ID: {post_id}'
# 1、/post/42 → 文章ID: 42
# 2、/post/abc → 404 错误(不匹配)# (3) 浮点数类型 <float:variable>
@app.route('/weight/<float:kg>')
def show_weight(kg):return f'重量: {kg} 千克'
# 1、/weight/5.2 → 重量: 5.2 千克

1.3 路由的其他高级用法

(1) 多规则路由
(2) HTTP 方法限制

GET:用于 请求数据(如加载页面、搜索)
POST:用于 提交数据(如登录、注册、上传文件)

(1) 多规则路由
@app.route('/')
@app.route('/home')
def home():return '首页'
# 访问 / 或 /home 均返回 '首页'
(2) HTTP 方法限制
@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':return '处理登录'return '显示登录表单' 
# 1、/login 路由可以同时处理 GET 和 POST 请求。
# 2、根据请求方法的不同,执行不同的逻辑(例如:GET 显示登录表单,POST 处理登录数据)。

二、变量规则

变量规则是 Flask 路由系统中用于动态匹配 URL 部分的关键特性,它允许你在 URL 中定义可变部分,并将这些部分作为参数传递给视图函数。

2.1 示例1:字符串类型(默认)

@app.route('/user/<username>')
def show_user(username):return f"Hello, {username}!"

匹配 /user/john → username=“john”
不匹配 /user/john/(因为默认不允许斜杠)

2.2 示例2:整数类型

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

匹配 /post/42 → post_id=42(整数)
不匹配 /post/abc(因为无法转换为整数)

2.3 示例3:路径类型

@app.route('/path/<path:subpath>')
def show_subpath(subpath):return f"Subpath: {subpath}"

匹配 /path/one/two/three → subpath=“one/two/three”

三、自定义转换器

需要知道<>是提取参数的作用
那么例如<int:id>中的int就是转换器
Flask 的自定义转换器基于== Werkzeug== 的 BaseConverter 类,其核心由三部分组成:

  1. 正则表达式:定义 URL 变量部分的匹配规则
  2. to_python 方法:将 URL 字符串转换为 Python 对象
  3. to_url 方法:将 Python 对象转换回 URL 字符串
from werkzeug.routing import BaseConverterclass RegexConverter(BaseConverter):def __init__(self, url_map, *items):super(RegexConverter, self).__init__(url_map)self.regex = items[0]app.url_map.converters['regex'] = RegexConverter@app.route('/regex/<regex("[a-z]{3}"):value>')
def show_regex(value):return f'Value: {value}'

3.1 核心组件详解

  1. DynamicRegexConverter 类
class DynamicRegexConverter(BaseConverter):

继承自 BaseConverter,这是所有Flask转换器的基类,主要目的是允许在路由定义中动态指定正则表达式。

  1. init 方法
def __init__(self, url_map, *args):super().__init__(url_map)self.regex = args[0]  # 从路由定义中获取正则表达式

url_map: Flask自动传入的URL映射对象
*args: 捕获所有额外的位置参数
args[0]: 获取路由定义中传入的第一个参数(即正则表达式字符串)

  1. 转换器注册
app.url_map.converters['dregex'] = DynamicRegexConverter

将自定义转换器注册到Flask应用中,dregex是转换器的名称,将在路由中使用

  1. 路由定义
@app.route('/product/<dregex("[A-Z]{3}-\d{4}"):product_code>')

分解路由参数部分:
<dregex(“[A-Z]{3}-\d{4}”):product_code>
dregex: 使用的转换器名称
[A-Z]{3}-\d{4}: 传递给转换器的正则表达式参数
product_code: 视图函数接收的参数名

3.2 工作流程详解

  1. 当访问 /product/ABC-1234 时:
  • 路由匹配阶段:
    Flask 看到 dregex 转换器,会使用 “[A-Z]{3}-\d{4}” 作为正则表达式,检查 “ABC-1234” 是否匹配该模式。
  • 正则表达式解析:
    [A-Z]{3}: 3个大写字母 → “ABC”
    -: 连字符 → “-”
    \d{4}: 4个数字 → “1234”
  • 参数传递:
    将 “ABC-1234” 作为 product_code 参数传递给视图函数
  1. 如果访问无效URL如 /product/abc-123:
  • 正则匹配失败(需要大写字母)
  • Flask 自动返回 404 Not Found

四、form表单

想象表单就像你去银行填的表格:
表格纸 = 标签
填写项 = 字段(姓名、电话等)
提交按钮 = 柜台工作人员收走表格

4.1 表单的三大组成部分

  1. 前端部分(HTML)
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="/submit" method="POST"><label>姓名:<input type="text" name="username"></label><label>密码:<input type="password" name="pwd"></label><button type="submit">提交</button>
</form>
</body>
</html>
  • action:表格交给谁(哪个URL)
  • method:邮寄方式(GET像明信片,POST像密封信件)
  • name:每个字段的标识(后端靠这个找数据)
  1. 后端部分(Flask)
from flask import request
from flask import Flask
# 从flask库中导入Flask类函数
app = Flask(__name__)
@app.route('/submit', methods=['POST'])
def handle_form():# 获取表单数据name = request.form['username']  # 根据name获取password = request.form['pwd']# 相当于银行职员查看表格内容print(f"收到:用户名{name},密码{password}")return "提交成功!"
  1. 数据传输过程
  • 用户填写 → 点击提交 → 浏览器打包数据 → 发送到服务器 → Flask拆包处理

五、request请求

  1. 基本属性
  • request.method: 请求方法(GET, POST等)
  • request.url: 完整的请求URL
  • request.path: URL的路径部分
  • request.host: 主机名
  • request.headers: 请求头字典
  1. 请求方法重点
  • GET请求
  • 用于获取资源
  • 参数通过URL传递
username = request.args.get('username')
# 或获取所有参数
args = request.args.to_dict()
  • POST请求
  • 用于提交数据
  • 参数通过请求体传递
username = request.form.get('username')
# 或获取所有参数
form_data = request.form.to_dict()
  1. request对象 和HTTP方法(GET/POST)
  • request对象:是Flask提供的"万能容器",包含了当前请求的所有信息
  • HTTP方法:只是request对象中记录的一个属性(request.method),表示本次请求的类型
  • 通俗理解:把HTTP请求比作快递包裹,request对象就是整个包裹(包含内容物、寄件人信息、快递单等),而GET/POST等HTTP方法只是快递单上的"快递类型"选项
  1. 总结
  • GET请求的参数会放在request.args中
  • POST请求的参数会放在request.form或request.json中
  • 其他数据(如文件)放在request.files中

六、重定向

重定向(Redirect)是Web开发中的一种关键机制,它允许服务器指示客户端(浏览器)自动转向另一个URL。

  1. 基本重定向方法
from flask import redirect
from flask import Flask
app = Flask(__name__)
# 硬编码URL方式(不推荐)
@app.route('/old')
def old_page():return redirect('/new-url')  # 默认302临时重定向# 使用url_for方式(推荐)
@app.route('/new')
def new_page():return redirect(url_for('profile', username='admin'))
  1. url_for的核心优势
    url_for()函数是Flask提供的URL构建器,它① 动态生成URL:基于视图函数名而非硬编码路径;②自动处理URL编码:特殊字符会自动转义;③支持参数传递:方便构建带查询参数的URL;④便于维护:URL变更只需修改路由定义,不影响视图函数。
  2. 重定向与url_for的深度配合
  • 带参数的重定向
@app.route('/product/<int:product_id>')
def product_detail(product_id):# 如果产品ID已更新,自动跳转到新IDnew_id = get_updated_id(product_id)if new_id != product_id:# 使用url_for自动构建新URLreturn redirect(url_for('product_detail', product_id=new_id), code=301)return f"显示产品{product_id}详情"

七、abort函数

abort函数是Flask中用于立即终止请求处理并返回HTTP错误响应的核心工具,其本质是通过抛出特殊异常来实现请求终止的。

# Flask内部的简化实现
from werkzeug.exceptions import HTTPException
def abort(status_code, *args, **kwargs):# 查找对应的异常类exception = _aborter.mapping.get(status_code, HTTPException)# 抛出异常raise exception(*args, **kwargs)

八、综合板块

1、前后端数据交互

1.1、通信基础

  1. 协议:基于HTTP/HTTPS协议
  2. 数据格式:JSON为主(也可用XML、FormData等)
  3. 交互方式:
  • 前端发起请求(Fetch/Axios/jQuery AJAX)
  • 后端接收处理并返回响应
  • 前端处理响应更新UI

1.2、后端代码

from flask import Flask, request, jsonify
app = Flask(__name__)
# 内存数据库
tasks = [{"id": 1, "task": "学习Flask", "done": False}
]
@app.route('/api/tasks', methods=['GET', 'POST'])
def handle_tasks():if request.method == 'GET':return jsonify({"tasks": tasks})  # 返回所有任务if request.method == 'POST':new_task = request.get_json()  # 获取前端发送的JSON数据new_task["id"] = len(tasks) + 1tasks.append(new_task)return jsonify(new_task), 201  # 返回新创建的任务
@app.route('/api/tasks/<int:task_id>', methods=['PUT'])
def update_task(task_id):task = next((t for t in tasks if t["id"] == task_id), None)if not task:return jsonify({"error": "任务不存在"}), 404update_data = request.get_json()task.update(update_data)  # 更新任务数据return jsonify(task)
if __name__ == '__main__':app.run()

1.3、前端代码

<!DOCTYPE html>
<html>
<body><h1>任务列表</h1><ul id="taskList"></ul> <input type="text" id="taskInput" placeholder="新任务"><button onclick="addTask()">添加</button><script>// 获取任务列表async function fetchTasks() {const response = await fetch('/api/tasks');const data = await response.json();renderTasks(data.tasks);}// 添加新任务async function addTask() {const taskText = document.getElementById('taskInput').value;const response = await fetch('/api/tasks', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({ task: taskText, done: false })});fetchTasks(); // 刷新列表}// 更新任务状态async function toggleTask(id) {await fetch(`/api/tasks/${id}`, {method: 'PUT',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({ done: true })});fetchTasks(); // 刷新列表}// 渲染任务列表function renderTasks(tasks) {const list = document.getElementById('taskList');list.innerHTML = tasks.map(task => `<li onclick="toggleTask(${task.id})">${task.task} - ${task.done ? '✓' : '✗'}</li>`).join('');}// 初始化加载fetchTasks();</script>
</body>
</html>

2、javascript中的 fetch API和 $.ajax API

🐾 (一)javascript中的 var 和 $
var:var 是一个关键字,用于声明变量。
$: $ 是jQuery函数的别名,通常用于选择DOM元素、创建jQuery对象等。
🐾 (二)javascript中的 fetch API 和 $.ajax API
(1)Fetch API: 是一个现代Web API,用于执行网络请求。 基于Promise设计,使得处理异步操作更加直观和易于管理。 提供了.then()和.catch()方法来处理Promise的解析和拒绝。
(2)jQuery $.ajax: 是jQuery库中的一个方法,用于发送异步HTTP请求。 提供了丰富的配置选项和回调函数,用于处理请求和响应。 支持多种类型的请求(GET、POST等)和数据格式(JSON、XML等)。

  • Fetch API 使用方法
  1. 初始化请求
fetch('/system/score_first/score_first')

这行代码使用fetch函数发起一个GET请求到指定的URL(/system/score_first/score_first)。fetch返回一个Promise对象,该对象在请求完成后会被解析或拒绝。

  1. 处理响应
.then(response => response.json())

请求成功后,response对象包含了服务器的响应。这里使用.json()方法将响应体解析为JSON格式,并返回一个新的Promise,该Promise在解析完成后会返回解析后的JSON数据。

  1. 更新ECharts图表
.then(data => {option1.xAxis[0].data = data.xData;option1.series[0].data = data.yData;myChart1.setOption(option1);
})

解析后的JSON数据(data)被用来更新ECharts的配置项(option1)。这里假设option1是一个已经定义好的ECharts配置项对象,它包含了图表的各种配置(如标题、坐标轴、系列等)。然后,使用myChart1.setOption(option1)方法应用这些更新。

  1. 错误处理
.catch(error => {console.error('Error fetching data:', error);
});

如果在请求过程中发生错误(如网络问题、服务器错误等),则执行.catch方法中的回调函数,并将错误信息打印到控制台。

  • jQuery $.ajax 使用方法
  1. 初始化请求
$.ajax({url: '/system/score_first/score_first',type: 'GET',dataType: 'json',// ...
});

这里使用$.ajax方法配置了一个AJAX请求。url指定了请求的URL,type指定了请求类型(GET),dataType指定了预期的服务器响应的数据类型(JSON)。

  1. 成功回调
success: function(data) {option1.xAxis[0].data = data.xData;option1.series[0].data = data.yData;myChart1.setOption(option1);
}

当请求成功时,success回调函数被调用,并传入解析后的响应数据(data)。

  1. 错误回调
error: function(xhr, status, error) {console.error('Error fetching data:', error);
}

如果请求失败,error回调函数被调用。

🐾 (三) . a j a x 获取后端数据加载文档对象模型 ‘ .ajax获取后端数据加载文档对象模型 ` .ajax获取后端数据加载文档对象模型(document).ready(function() { … }); 这段代码的作用是确保DOM(文档对象模型)完全加载和解析完成后再执行包含在其中的$.ajax等代码。`

// 1  fetch方法
var myChart1 = echarts.init(document.getElementById('echarts-records'), 'walden')
function mychart1(time){if(time=='year1'){fetch('/system/score_first/score_first')  .then(response => response.json())  .then(data => {   option1.xAxis[0].data = data.xData;   option1.series[0].data = data.yData;   myChart1.setOption(option1);  })  .catch(error => {  console.error('Error fetching data:', error);  })});
});// 2  $.ajax方法
var myChart1 = echarts.init(document.getElementById('echarts-records'), 'walden')
function mychart1(time){if(time=='year1'){$.ajax({  url: '/system/score_first/score_first',  type: 'GET',  dataType: 'json',  success: function(data) {option1.xAxis[0].data = data.xData;   option1.series[0].data = data.yData;   myChart1.setOption(option1);  }error: function(xhr, status, error) {console.error('Error fetching data:', error);}});
});// 3  $.ajax获取后端数据加载文档对象模型
$(document).ready(function() {$.ajax({url: 'some-url',method: 'GET',success: function(data) {}});
});

🐾 总结:到这flask框架的基本概念就结束了,其实flask框架内还有很多高级用法,后续用到再进行更新吧~

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

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

相关文章

AI赋能守护行车安全新防线,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建驾驶车辆场景下驾驶员疲劳分心驾驶行为智能检测预警系统

在当今社会&#xff0c;随着科技生产力的飞速发展&#xff0c;汽车早已成为人们日常出行不可或缺的交通工具。它不仅极大地提高了人们的出行效率&#xff0c;也为生活带来了诸多便利。然而&#xff0c;随着汽车保有量的不断增加&#xff0c;交通安全问题也日益凸显。疲劳驾驶和…

onloyoffice历史版本功能实现,版本恢复功能,编辑器功能实现 springboot+vue2

文章目录 onloyoffice历史版本功能实现&#xff0c;版本恢复功能&#xff0c;编辑器功能实现 springbootvue2前提 需要注意把这个 (改成自己服务器的ip或者域名) 改成 自己服务器的域名或者地址我使用的onloyoffice版本 8.1.3.41. onloyoffice服务器部署 搜索其他文章2. 前段代…

概率论与统计(不确定性分析)主要应用在什么方面?涉及到具体知识是什么?

用户问的是概率论与统计&#xff08;不确定性分析&#xff09;的主要应用方面&#xff0c;涉及的具体知识以及具体公式。首先&#xff0c;我需要确定概率论与统计在哪些领域有应用&#xff0c;比如工程、金融、医学、数据科学等等。然后&#xff0c;具体知识部分应该包括概率论…

如何利用快照与备份快速恢复服务器的数据

在服务器上利用**快照&#xff08;Snapshot&#xff09;**和**备份&#xff08;Backup&#xff09;**快速恢复数据&#xff0c;可显著减少停机时间并确保业务连续性。以下是具体操作步骤和最佳实践&#xff1a; --- ### **1. 快照&#xff08;Snapshot&#xff09;恢复** **适…

安卓APP开发项目源码

在移动互联网蓬勃发展的今天&#xff0c;安卓应用几乎覆盖了人们生活的方方面面。从社交、购物&#xff0c;到医疗、教育&#xff0c;APP 的需求呈指数级增长。然而&#xff0c;如何高效、低成本地开发一款质量可靠的安卓应用&#xff0c;仍是很多开发者和团队关注的核心问题。…

遨游三防|30200mAh、双露营灯三防平板,见证堆料天花板

在工业4.0与智能化转型的浪潮中&#xff0c;专业设备对性能、防护及场景适应性的要求日益严苛。遨游通讯作为国家级高新技术企业&#xff0c;依托“危、急、特”场景的深耕经验&#xff0c;推出的旗舰级产品AORO-P300三防平板&#xff0c;以30200mAh超大容量电池、双露营灯设计…

【Python】Matplotlib:立体永生花绘制

本文代码部分实现参考自CSDN博客&#xff1a;https://blog.csdn.net/ak_bingbing/article/details/135852038 一、引言 Matplotlib作为Python生态中最著名的可视化库&#xff0c;其三维绘图功能可以创造出令人惊叹的数学艺术。本文将通过一个独特的参数方程&#xff0c;结合极…

OpenCV 图形API(57)颜色空间转换-----将图像从 RGB 色彩空间转换为 YUV 色彩空间函数RGB2YUV()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从 RGB 色彩空间转换为 YUV 色彩空间。 该函数将输入图像从 RGB 色彩空间转换为 YUV。R、G 和 B 通道值的常规范围是 0 到 255。 在进行线…

Kubernetes(K8S)入门阶段详细指南

Kubernetes(K8S)入门阶段详细指南 一、容器技术基础:Docker核心操作与理解 1.1 Docker核心操作 镜像管理: 拉取镜像:docker pull ubuntu(以Ubuntu为例)查看本地镜像:docker images删除镜像:docker rmi <image_id>容器生命周期管理: 启动容器:docker run -d -…

AI大模型学习十一:‌尝鲜ubuntu 25.04 桌面版私有化sealos cloud + devbox+minio,实战运行成功

一、说明 没意思&#xff0c;devbox私有化不支持&#xff0c;看来这个开源意义不大&#xff0c;和宣传差距很大啊&#xff0c;那devbox就不用玩 用了ubuntu 25.04&#xff0c;内核为GNU/Linux 6.14.0-15-generic x86_64&#xff0c;升级了部分image&#xff0c;过程曲折啊 se…

[GXYCTF2019]Ping Ping Ping

解题步骤 1、先使用 内敛执行 查看当前的php文件 执行 命令执行 发现空格被过滤 ?ip127.0.0.1$IFS|$IFSwhomi 还有一个点就是这个 执行的命令是不能进行拼接的 可能就是被过滤了 | 所以我们使用 ; 进行绕过一下 空格过滤代替 $IFS ${IFS} ${IFS}$9 //这里$1到$9都可以 $IFS$1…

重温TCP通信过程

文章目录 1. 慢启动2. 拥塞避免 3. 快速重传和快速恢复 初识tcp报文 我们先来简单认识一下报文的格式,具体理解需要后面详细介绍 源端口和目的端口:顾名思义就是标识传输双方的信息首部长度:指的是TCP报头的长度,换句话来说,我们需要用一个属性来描述报头的长度,就说明TCP的报…

力扣HOT100之链表:23. 合并 K 个升序链表

这道题我是用最淳朴最简单的思路去做的&#xff0c;用一个while循环持续地将当前遍历到的最小值加入到合并链表中&#xff0c;while循环中使用一个for循环遍历整个指针数组&#xff0c;将其中的最小值和对应下标记录下来&#xff0c;并将其值加入到合并链表中&#xff0c;同时对…

Spring Boot 支持政策

&#x1f9d1;&#x1f4bb; Spring Boot 支持政策 ✒️ Andy Wilkinson 于2023年12月7日编辑本页 32次修订 &#x1f4cc; 核心政策 &#x1f6e1;️ VMware Tanzu 开源支持政策 Spring Boot 针对关键错误和安全问题提供支持 &#x1f4c6; 版本支持周期 1️⃣ 主要版本&a…

WeakAuras Lua Script TOC BOSS2 <Lord Jaraxxus>

WeakAuras Lua脚本&#xff08;WA 字符串&#xff09; 十字军试炼老2 加拉克苏斯 血肉成灰 !WA:2!TIv7VnYrz8UXuDudiDN7PqFfCdTHKYLOeN7sBpXvKDIZf36Kyw7KRT3DYE2Dh7DAwV7CZSoXUOIewf4GdAfgbu13LPasv8MS4diavKoH4RSkIp0phXDT8je5FGYZmZU2oVCqrGLJZUpZZoZZB)EEz1wkr9ewjSU6MD5u…

Spring security详细上手教学(二)用户管理

Spring security详细上手教学&#xff08;二&#xff09;用户管理 这章节主要学习&#xff1a; 如何使用UserDetails接口描述用户在鉴权流中使用UserDetailsService自定义的UserDetailsService实现自定义的UserDetailsManager实现在鉴权中使用JdbcUserDetialsManager 在Spri…

网络安全厂商F5荣登2025 CRN AI 100榜单,释放AI潜力

近期&#xff0c;网络安全厂商F5凭借其应用交付和安全技术与前沿的人工智能洞察&#xff0c;成功入选“2025 CRN AI 100 榜单”&#xff0c;并跻身“领导者”之列。这一荣誉的获得&#xff0c;彰显了F5在助力企业拥抱人工智能创新的过程中&#xff0c;无需牺牲性能、灵活性或安…

4.RabbitMQ - 延迟消息

RabbitMQ延迟消息 文章目录 RabbitMQ延迟消息一、延迟消息介绍二、实现2.1 死信交换机2.2 延迟消息插件2.3 取消超时订单 一、延迟消息介绍 延迟消息&#xff1a;生产者发送消息时指定一个时间&#xff0c;消费者不会立刻收到消息&#xff0c;而是在指定时间后才收到消息 用户…

5.学习笔记-SpringMVC(P53-P60)

1.响应 &#xff08;1&#xff09;响应页面 &#xff08;2&#xff09;响应数据&#xff08;异步提交&#xff09;&#xff1a;文本数据、json数据 2.REST风格 (1)REST:表现形式状态转换。 (2)传统风格资源描述形式 3.Restful入门案例 5.基于RESTful页面数据…

Golang | 搜索表达式

// (( A | B | C ) & D ) | E & (( F | G ) & H )import "strings"// 实例化一个搜索表达式 func NewTermQuery(field, keyword string) *TermQuery {return &TermQuery{Keyword: &Keyword{Field: field, Word: keyword},} }func (tq *TermQuery…