【FastAPI】中间件
【FastAPI】中间件
- 一、概述
- 二、作用
- 2.1 日志记录与监控
- 2.2 身份验证与授权
- 2.3 CORS(跨域资源共享)
- 2.4 Gzip压缩
- 2.5 会话管理
- 2.6 自定义功能
- 2.7 执行顺序
- 三、 总结
- 四、相关链接
一、概述
FastAPI的中间件提供了一种强大的机制,允许开发者在请求被处理之前以及响应返回给客户端之前对它们进行拦截和操作。
这为实现诸如日志记录、身份验证、性能监控、错误处理等功能提供了极大的灵活性。
二、作用
2.1 日志记录与监控
中间件可以用来记录所有进入系统的HTTP请求及其对应的响应
。
例如,你可以创建一个中间件来测量每个请求的处理时间,并将这个信息作为自定义头部X-Process-Time
添加到响应中。
这对于性能分析非常有用,因为它可以帮助你了解哪些请求消耗了较多的时间,从而优化系统性能。
import json
import logging
import os
import time
from fastapi import FastAPI, Request, Response
from starlette.middleware.base import BaseHTTPMiddleware# 设置日志格式和级别
LOG_LEVEL = os.getenv('LOG_LEVEL', 'INFO').upper()
logging.basicConfig(level=LOG_LEVEL,format='%(asctime)s - %(levelname)s - %(message)s'
)class LoggingMiddleware(BaseHTTPMiddleware):async def dispatch(self, request: Request, call_next) -> Response:start_time = time.perf_counter()response = await call_next(request)process_time = time.perf_counter() - start_timelog_data = {"client_ip": request.client.host,"method": request.method,"path": request.url.path,"status_code": response.status_code,"process_time": f"{process_time:.4f}s","timestamp": datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')}# 根据环境变量决定是否打印详细的日志内容if LOG_LEVEL == 'DEBUG':log_data["headers"] = dict(request.headers)log_data["query_params"] = dict(request.query_params)logging.info(json.dumps(log_data))return responseapp = FastAPI()
app.add_middleware(LoggingMiddleware)@app.get("/")
async def root():return {"message": "Hello World"}if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000, log_level=LOG_LEVEL.lower())
测试方法:
- 启动应用:
python main.py
- 使用浏览器或Postman访问
http://localhost:8000/
- 查看命令行输出的日志信息,确认日志已正确记录。
2024-12-25 19:21:56,568 - INFO - {"client_ip": "127.0.0.1", "method": "GET", "path": "/", "status_code": 200, "process_time": "0.0003s", "timestamp": "2024-12-25 19:21:56"}
INFO: 127.0.0.1:53956 - "GET / HTTP/1.1" 200 OK
- 设置日志配置
这里设置了日志记录器的基本配置。通过环境变量LOG_LEVEL
来控制日志级别,默认为INFO
。
这意味着除非设置了更低的日志级别(如 DEBUG),否则不会输出调试信息。
此外,还指定了日志格式
,包括时间戳
、日志级别
和消息内容
。
LOG_LEVEL = os.getenv('LOG_LEVEL', 'INFO').upper()
logging.basicConfig(level=LOG_LEVEL,format='%(asctime)s - %(levelname)s - %(message)s'
)
- 自定义中间件 LoggingMiddleware
中间件是用来处理请求和响应之间逻辑的理想场所。
在这个例子中,LoggingMiddleware
被用来捕获每次请求的时间点,然后在请求完成后计算处理所需的时间,并将相关信息以 JSON 格式记录下来。这有助于监控 API 性能并诊断问题。
- 开始计时:使用
time.perf_counter()
获取当前时间。 - 调用下一个处理器:通过
await call_next(request)
将请求传递给下一个中间件或最终的路由处理器。 - 结束计时:再次调用
time.perf_counter()
计算总耗时。 - 构建日志数据:创建一个字典
log_data
包含客户端 IP、HTTP 方法、路径、状态码及处理时间等信息。 - 条件性添加更多信息:如果日志级别为
DEBUG
,还会额外添加请求头和查询参数到日志中,以便于更详细的调试。 - 记录日志:最后,将构造好的日志数据转换成
JSON
字符串并通过logging.info()
输出。
- 定义 FastAPI 应用程序
这里创建了一个 FastAPI 实例 app 并注册了之前定义的 LoggingMiddleware。随后定义了一个 GET 方法对应的路由 /,当访问根路径时会返回一个 JSON 响应,其中包含了一条简单的欢迎信息 “Hello World”。
app = FastAPI()
app.add_middleware(LoggingMiddleware)@app.get("/")
async def root():return {"message": "Hello World"}
- 启动 Uvicorn 服务器
这段代码确保只有当脚本作为主模块运行时才会启动 Uvicorn 服务器。
Uvicorn 是一个用于运行 ASGI 应用的异步服务器,它将托管 FastAPI 应用程序,并监听指定的主机地址 (0.0.0.0) 和端口 (8000)。
同时,也将日志级别传递给 Uvicorn,以保证一致性。
if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000, log_level=LOG_LEVEL.lower())
2.2 身份验证与授权
通过中间件,可以在请求到达路由处理器之前检查用户的身份验证状态。
- 如果请求未通过身份验证,则可以直接返回
401 Unauthorized
响应; - 如果通过了身份验证但没有足够的权限访问特定资源,则可以返回
403 Forbidden
响应。
这种方式确保了只有经过适当授权的用户才能访问受保护的API端点。
from datetime import datetime, timedelta
from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from jose import JWTError, jwt
from pydantic import BaseModel
from typing import Optional
from fastapi.middleware.cors import CORSMiddleware
from fastapi.middleware.base import BaseHTTPMiddlewareSECRET_KEY = "your_secret_key"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")class Token(BaseModel):access_token: strtoken_type: strclass TokenData(BaseModel):username: Optional[str] = Nonefake_users_db = {"johndoe": {"username": "johndoe","full_name": "John Doe","email": "johndoe@example.com","hashed_password": "fakehashedsecret","disabled": False,}
}def verify_password(plain_password, hashed_password):return plain_password == hashed_passworddef get_user(db, username: str):if username in db:user_dict = db[username]return UserInDB(**user_dict)def authenticate_user(fake_db, username: str, password: str):user = get_user(fake_db, username)if not user:return Falseif not verify_password(password, user.hashed_password):return Falsereturn userdef create_access_token(data: dict, expires_delta: Optional[timedelta] = None):to_encode = data.copy()if expires_delta:expire = datetime.utcnow() + expires_deltaelse:expire = datetime.utcnow() + timedelta(minutes=15)to_encode.update({"exp": expire})encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)return encoded_jwtasync def get_current_user(token: str = Depends(oauth2_scheme)):credentials_exception = HTTPException(status_code=status.HTTP_401_UNAUTHORIZED,detail="Could not validate credentials",headers={"WWW-Authenticate": "Bearer"},)try:payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])username: str = payload.get("sub")exp: int = payload.get("exp")if username is None or exp is None:raise credentials_exceptionif datetime.utcfromtimestamp(exp) < datetime.utcnow():raise credentials_exceptiontoken_data = TokenData(username=username)except JWTError:raise credentials_exceptionuser = get_user(fake_users_db, username=token_data.username)if user is None:raise credentials_exceptionreturn userclass AuthMiddleware(BaseHTTPMiddleware):async def dispatch(self, request: Request, call_next) -> Response:token = request.headers.get('Authorization')if token:try:await get_current_user(token.split()[1]) # Assuming 'Bearer <token>'except HTTPException as e:return JSONResponse(status_code=e.status_code, content={"detail": e.detail})else:return JSONResponse(status_code=401, content={"detail": "Unauthorized"})return await call_next(request)app = FastAPI()
app.add_middleware(AuthMiddleware)@app.post("/token", response_model=Token)
async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()):user = authenticate_user(fake_users_db, form_data.username, form_data.password)if not user:raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED,detail="Incorrect username or password",headers={"WWW-Authenticate": "Bearer"},)access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)access_token = create_access_token(data={"sub": user.username}, expires_delta=access_token_expires)return {"access_token": access_token, "token_type": "bearer"}@app.get("/users/me", response_model=User)
async def read_users_me(current_user: User = Depends(get_current_user)):return current_userif __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000)
2.3 CORS(跨域资源共享)
为了使Web应用程序能够从不同的域名发出AJAX请求,你需要配置CORS策略。
FastAPI内置了CORSMiddleware,它允许你轻松地设置允许的来源、方法、头等参数,从而实现安全且灵活的跨域通信2。
下面是一个支持CORS配置的应用程序示例,允许来自特定源的请求,并处理预检请求(Preflight Requests)。
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddlewareapp = FastAPI()origins = ["http://localhost:3000",
]app.add_middleware(CORSMiddleware,allow_origins=origins,allow_credentials=True,allow_methods=["*"],allow_headers=["*"],expose_headers=["X-Total-Count"],max_age=86400
)@app.get("/")
async def root():return {"message": "Hello World"}if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000)
2.4 Gzip压缩
对于需要提高传输效率的情况,可以使用Gzip中间件来压缩响应内容。这样不仅可以减少网络带宽占用,还能加快页面加载速度,特别是在移动设备上效果尤为明显2。
from fastapi import FastAPI
from fastapi.middleware.gzip import GZipMiddlewareapp = FastAPI()app.add_middleware(GZipMiddleware,minimum_size=1000,compresslevel=9
)@app.get("/")
async def root():large_text = "a" * 1024 # 创建一个较大的字符串用于测试压缩效果return {"message": large_text}if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000)
2.5 会话管理
借助于SessionMiddleware,你可以方便地管理用户的会话信息。
比如,在登录后存储用户的认证令牌或其他临时数据,这些数据可以通过cookie传递并在后续请求中读取2。
// A code block
var foo = 'bar';
2.6 自定义功能
除了上述提到的功能之外,中间件还可以用于执行其他任何你想要在每次请求或响应时运行的任务。例如,你可以编写一个中间件来解析并标准化查询字符串参数,或者根据某些条件修改请求体中的内容7。
// A code block
var foo = 'bar';
2.7 执行顺序
值得注意的是,当多个中间件同时存在于一个应用中时,它们按照“后进先出”的原则被执行。
也就是说,最后添加的那个中间件会在最前面被调用,并且最先完成其工作之后再交给下一个中间件继续处理。
// A code block
var foo = 'bar';
三、 总结
总之,FastAPI中的中间件是一个非常强大且灵活的工具,它使得开发者能够在不改变核心业务逻辑的前提下,轻松地向应用程序添加各种辅助性功能和服务。
无论是为了增强安全性、改善用户体验还是简化开发流程,合理利用中间件都能带来显著的好处。
四、相关链接
【FastAPI】日志
【FastAPI】中间件
【FastAPI】简介
【FastAPI】BaseModel类
相关文章:
【FastAPI】中间件
【FastAPI】中间件 一、概述二、作用2.1 日志记录与监控2.2 身份验证与授权2.3 CORS(跨域资源共享)2.4 Gzip压缩2.5 会话管理2.6 自定义功能2.7 执行顺序 三、 总结四、相关链接 一、概述 FastAPI的中间件提供了一种强大的机制,允许开发者在…...
文档大师:打造一站式 Word 报告解决方案1
前言 在政府、医院、银行、财务以及销售等领域,常常需要创建各种报告文件来展开工作汇报,譬如季度销售报告、年度总结报告、体检报告和保险合同等。在没有报表工具支持之前,这类报告主要通过 Word 制作,费时费力且难以维护&#…...
再谈c++线性关系求值
目的 线性关系是最简单的一种关系,在编程当中应用非常多,所以,再说一次线性关系。 线性关系的定义是这样的: 两个变量之间存在一次方函数关系,就称它们之间存在线性关系。正比例关系是线性关系中的特例,反…...
【ES6复习笔记】Class类(15)
介绍 ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过 class 关键字,可以定义类。基本上,ES6 的 class 可以看作只是一个语法糖,它的绝大部分功能,…...
AppAgent 源码 (xml 解析)
1. 数据准备 adb shell uiautomator dump /sdcard/output.xml # 获取手机ui界面的xml文件 adb pull /sdcard/output.xml output.xml # 将手机上的xml文件拉取到电脑上具体的xml文件: <?xml version1.0 encodingUTF-8 standaloneyes ?> <hierarchy ro…...
Oracle 11G还有新BUG?ORACLE 表空间迷案!
前段时间遇到一个奇葩的问题,在开了SR和oracle support追踪两周以后才算是有了不算完美的结果,在这里整理出来给大家分享。 1.问题描述 12/13我司某基地MES全厂停线,系统卡死不可用,通知到我排查,查看alert log看到是…...
FreeSwitch中启用WebRTC
在FreeSwitch中启用WebRTC需要进行一系列配置。以下是详细的步骤: 1. 安装必要的依赖: 确保安装了支持WebRTC的依赖库,如libsrtp。 2. 配置SIP Profile: 编辑 conf/sip_profiles/internal.xml 文件,添加或修改以下内…...
力扣矩阵-算法模版总结
lc-73.矩阵置零-(时隔14天)-12.27 思路:(23min22s) 1.直接遍历遇0将行列设0肯定不行,会影响后续判断,题目又要求原地算法,那么进一步考虑是否可以将元素为0,其行列需要设为0的位置给存储下来,最后再遍历根据…...
服务端高并发分布式结构演进之路
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 服务端高并发分布式结构演进之路 收录于专栏[redis] 本专栏旨在分享学习Redis的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 概述 …...
虚拟机桥接模式
主机Win10,虚拟机xp 1.虚拟机设置中选择桥接模式 2.在虚拟机菜单:编辑>虚拟机网络编辑,点击“更改设置”,可以看到三个网卡,这三个网卡分别对应不同的网络共享模式。桥接模式须使用VMnet0,如果没看到这个网卡&…...
JVM调优实践篇
理论篇 1多功能养鱼塘-JVM内存 大鱼塘O(可分配内存): JVM可以调度使用的总的内存数,这个数量受操作系统进程寻址范围、系统虚拟内存总数、系统物理内存总数、其他系统运行所占用的内存资源等因素的制约。 小池塘A&a…...
SpeedTree学习笔记总结
SpeedTree是一款业界领先的三维树木植被建模软件,特别适用于游戏开发和影视制作。 一、基础操作 旋转:鼠标左键 平移:鼠标中键 缩放:鼠标中键滚动 Trunks树干节点 Branches树枝 Cap给树干封口 Frond创建大树叶 Decorations…...
【MuJoCo和PhysX】
MuJoCo 与 Unity 的 PhysX 引擎的主要区别 应用领域: MuJoCo:主要用于机器人学、强化学习、生物力学等领域,擅长处理多自由度、复杂动力学问题,尤其适合进行高精度的物理仿真。 Unity PhysX:主要用于游戏开发、虚拟现…...
HTML制作一个普通的背景换肤案例2024版
一,完整的代码: <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>换肤</t…...
python学opencv|读取图像(二十一)使用cv2.circle()绘制圆形进阶
【1】引言 前序已经掌握了使用cv2.circle()绘制圆形的基本操作,相关链接为: python学opencv|读取图像(二十)使用cv2.circle()绘制圆形-CSDN博客 由于圆形本身绘制起来比较简单,因此可以自由操作的空间也就大&#x…...
qt QZipReader详解
1、概述 QZipReader 是 Qt 中用于从 .zip 文件中读取和提取文件内容的类。它提供了便捷的方法来访问压缩包中的文件和目录,并允许你解压缩单个或多个文件。通过 QZipReader,你可以以编程方式读取 .zip 文件中的内容,并提取它们到目标目录中。…...
开发场景中Java 集合的最佳选择
在 Java 开发中,集合类是处理数据的核心工具。合理选择集合,不仅可以提高代码效率,还能让代码更简洁。本篇文章将重点探讨 List、Set 和 Map 的适用场景及优缺点,帮助你在实际开发中找到最佳解决方案。 一、List:有序存…...
顶顶通呼叫中心中间件mod_cti模块安全增强,预防盗打风险(mod_cti基于FreeSWITCH)
文章目录 前言联系我们mod_cti版本支持安全加强说明 前言 FreeSWITCH暴露在公网最大的风险就是被不法之人盗打 出现盗打的主要原因以下几点: 分机密码太简单或者密码泄露了拨号方案配置不合理sofia配置错误 所以我们给顶顶通呼叫中心中间件添加了安全加强功能&am…...
bash shell的条件语句
~ script% touch if.sh ~ script% chmod 755 if.sh1.if-then-fi #!/usr/bin/env bashFOOD$1 if [ $FOOD"apple" ] thenecho The food is $FOOD fi exit 0~ script % ./if.sh apple The food is apple如果要将多条语句写在一行,可以…...
拦截器Interceptor与过滤器Filter
拦截器Interceptor 定义: SpringMVC内置拦截机制,允许在请求被目标方法处理的前后进行拦截,执行一些额外操作;比如:权限验证,日志记录,数据共享等。 实现步骤 1、自定义拦截器 Component public class …...
水电站视频智能监控系统方案设计与技术应用方案
一、背景需求 水电站作为国家重要的能源基地,其安全运行对于保障能源供应和社会稳定具有重要意义。然而,传统的人工监控方式存在着诸多问题,如人力成本高、监控范围有限、反应不及时等。因此,水电站急需引进一种先进的视频智能监控…...
教师管理系统
大概功能: 1.显示所有教师 2.按姓名查找教师 3.按工号查找教师 4.增加教师 5.删除教师 6.退出 数据会保存到 txt 文件里面 姓名:必须是中文 手机号码:必须是11位,必须是数字 效果展示: 代码展示: Teache…...
nexus docker安装
#nexus docker 安装 docker pull sonatype/nexus3 mkdir -p /data/nexus-data docker run -itd -p 8081:8081 --privilegedtrue --name nexus3 \ -v /data/nexus-data:/var/nexus-data --restartalways docker.io/sonatype/nexus3 #访问 http://192.168.31.109:8081/ 用户名&am…...
canvas之进度条
canvas之进度条 效果: 封装的组件 <template><div class"circle" :style"{ width: props.radius px, height: props.radius px }"><div class"circle-bg" :style"{ width: props.radius - 5 px, height: pr…...
【ES6复习笔记】Promise对象详解(12)
1. 什么是 Promise? Promise 是 JavaScript 中处理异步操作的一种机制,它可以让异步操作更加容易管理和控制。Promise 对象代表一个异步操作的最终完成或失败,并提供了一种方式来处理操作的结果。 2. Promise 的基本语法 Promise 对象有三…...
前端Python应用指南(五)用FastAPI快速构建高性能API
《写给前端的python应用指南》系列: (一)快速构建 Web 服务器 - Flask vs Node.js 对比(二)深入Flask:理解Flask的应用结构与模块化设计(三)Django vs Flask:哪种框架适…...
c#多线程之生产者-消费者模型
在 C# 中实现 生产者-消费者模式,通常需要多个线程来处理数据的生产和消费。我们可以使用 Queue<T> 来作为存储数据的队列,并使用 Thread、Mutex 或 Monitor 来确保线程安全。BlockingCollection<T> 是 C# 提供的一个线程安全的集合…...
2011-2020年各省城镇职工基本医疗保险年末参保人数数据
2011-2020年各省城镇职工基本医疗保险年末参保人数数据 1、时间:2011-2020年 2、来源:国家统计局 3、指标:省份、时间、城镇职工基本医疗保险年末参保人数 4、范围:31省 5、指标解释:参保人数指报告期末按国家有关…...
Python基础语法知识——列表、字典、元组与集合
列表(list)、字典(dictionary)、元组(tuple)与集合(set)都可以看成存储数据的容器,但是前两者常用,后两者用得相对较少。 目录 1 列表(list) 1.1列表入门 1 列表(list) 1.1列表入门 class1["李白…...
Mysql数据库中,监测某张表中某字段的修改情况(被哪个ip所修改、新老值)
在Mysql数据库中,通过写一个触发器,来监测某张表(q_device)字段(run_status)的改变情况。 【示例】 -- 1. 创建监测日志表 CREATE TABLE change_log (id INT AUTO_INCREMENT PRIMARY KEY,table_name VARCHAR(255),column_name VARCHAR(255),old_value T…...
迁移学习 详解及应用示例
简介: 迁移学习是一种机器学习技术,其核心思想是利用在一个任务上已经学到的知识(源任务:任务已经有一个训练好的模型,然后我们将这个模型的某些部分或知识迁移到一个新的但相关的“目标任务”上。)来帮助解…...
ubuntu控制器多网口配置
在Ubuntu系统中配置多网口,可以通过编辑网络配置文件(Netplan 或旧版 /etc/network/interfaces)实现。这适用于需要管理多个网络接口(如 eth0、eth1 等)的场景,例如负载均衡、网络隔离或多路径通信。 以下…...
接口调用限频(代理模式+滑动窗口)
目录 代码示例 接口 代理 接口实现 限流工厂 限流处理器接口 直接交换处理器 限流处理器 限流配置 滑动窗口限流 通过代理模式滑动窗口,限流请求第三方平台,避免出现第三方平台抛出限流异常,影响正常业务流程,从出口出发…...
FFmpeg在python里推流被处理过的视频流
链式算法处理视频流 视频源是本地摄像头 # codinggbk # 本地摄像头直接推流到 RTMP 服务器 import cv2 import mediapipe as mp import subprocess as sp# 初始化 Mediapipe mp_drawing mp.solutions.drawing_utils mp_drawing_styles mp.solutions.drawing_styles mp_holis…...
2- Linux系统的命令帮助
Linux 命令行帮助信息使用指南 一、引言 对于初学者来说,Linux命令行可能会显得复杂和难以捉摸。然而,一旦掌握了如何有效地利用命令行的帮助信息,您将发现它是一个强大而灵活的工具,可以极大地提高您的工作效率。本指南旨在为新手介绍如何在Linux中获取命令的帮助信息,…...
Mysql事务
一、数据库事务基础 1.1. 什么是事务 简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在 MySQL 中,事务支持是在引擎层实现的。 比如 MySQL 原生的MyISAM引擎就不支持事务,这也是MyISAM被InnoDB…...
Fast adaptively balanced min-cut clustering
#0.论文信息 标题:Fast adaptively balanced min-cut clustering期刊:Pattern Recognition作者: Feiping Nie , Fangyuan Xie , Jingyu Wang ,Xuelong Li机构: China Telecom, Northwestern Polytechnic al University.代码链接: #1.摘要 …...
vue3和springboot使用websocket通信
前端端口:9090 后端端口:8080 vue3 引入依赖: npm install sockjs-client stomp/stompjs vue页面 <template><div><h1>WebSocket 示例</h1><button click"sendMessage">发送消息</button>…...
Log4j2的Policies详解、SizeBasedTriggeringPolicy、TimeBasedTriggeringPolicy
文章目录 一、Policies二、SizeBasedTriggeringPolicy:基于文件大小的滚动策略2.1、文件达到指定大小就归档 三、TimeBasedTriggeringPolicy:基于时间间隔的滚动策略3.1、验证秒钟归档场景3.2、验证分钟场景3.3、验证小时场景 四、多策略组合使用五、扩展知识5.1、S…...
js版本之ES6特性简述【Proxy、Reflect、Iterator、Generator】(五)
目录 Proxy Reflect 静态方法 部分实例 Iterator 实际开发迭代器的使用实例 迭代器(Iterator)应用 Generator Proxy Proxy 是 ES6 中新增的对象 Proxy 是JavaScript中的内置对象,它提供了一种机制,可以拦截并自定义各种…...
微信V3支付报错 平台证书及平台证书序列号
1.平台证书及平台证书序列号设置错误报错: 错误1: Verify the response’s data with: timestamp1735184656, noncea5806b8cabc923299f8db1a174f3a4d0, signatureFZ5FgD/jtt4J99GKssKWKA/0buBSOAbWcu6H52l2UqqaJKvrsNxvodB569ZFz5G3fbassOQcSh5BFq6hvE…...
【开发问题记录】执行 git cz 报require() of ES Module…… 错误
文章目录 1、问题2、解决3、参考链接 1、问题 在对 commitizen 进行完,一系列的初始化以后 , 对代码进行 提交 到暂存区,然后要提交到 本地仓库 的报错 然后因为安装了 commitizen 所以是想用 git cz 进行提交的, 执行命令的时候…...
Kubernetes 安装 Nginx以及配置自动补全
部署 Nginx : [rootk8s-master ~]# kubectl create deployment nginx --imagenginx:1.14-alpine deployment.apps/nginx created暴露端口: [rootk8s-master ~]# kubectl expose deployment nginx --port80 --typeNodePort service/nginx exposed查看服…...
JS中的闭包和上下文
变量提升 和 函数提升 这里要提到一个提升的概念,即在JS中,在解析代码之前还有一个预处理的过程,这个过程中会把部分变量和函数声明提前到代码的最顶部, 会在其他所有代码之前执行。虽然当我们按照规范(严格模式或者T…...
element-ui表格多级表头固定列和合并单元格
多级表头固定列 代码示例-不能直接运行,仅供参考 <el-table ref"table" class"table":data"list"style"width: 100%":header-cell-style"headerCellStyle"v-loading"dataLoading":span-method&qu…...
视频汇聚融合云平台Liveweb一站式解决视频资源管理痛点
随着5G技术的广泛应用,各领域都在通信技术加持下通过海量终端设备收集了大量视频、图像等物联网数据,并通过人工智能、大数据、视频监控等技术方式来让我们的世界更安全、更高效。然而,随着数字化建设和生产经营管理活动的长期开展࿰…...
第五十九章 假脱机设备
文章目录 第五十九章 假脱机设备介绍打开和使用假脱机设备用于假脱机设备的 OPEN 和 USE 命令USE 命令 第五十九章 假脱机设备 介绍 IRIS数据平台使能够将打印输出直接发送到您的打印机或屏幕,或将其保留在后台打印中以供以后打印。IRIS 假脱机独立于您的操作系统…...
Maven Wrapper 报错“未找到有效的 Maven 安装”
1. 检查 Maven Wrapper 配置: 确保你的项目中包含 .mvn/wrapper/maven-wrapper.properties 文件。 检查该文件中的 distributionUrl 属性,确保它指向一个有效的 Maven 发行版 URL。 2.确认 Maven Wrapper 脚本存在: 在项目根目录下&#x…...
yarn list --pattern vuex-module-decorators
dgqdgqdeMac-mini spid-admin % yarn list --pattern vuex-module-decorators yarn list v1.22.22 └─ vuex-module-decorators0.16.1 ✨ Done in 0.24s.好的,这段代码是一个典型的 Vuex 模块定义,使用了 vuex-module-decorators 库。这个库为 Vuex 提…...
day19-Linux软件包
科普,什么是代码文件。 电脑程序Program,就是某一个编程语言编写的一个代码文件,里面包含了该语言特有的指令,以及各种字符、符号。 linux自带的network管理脚本,shell脚本 什么是软件程序。 软件程序,就…...