Kubernetes Python 客户端 V1QueuingConfiguration 模型详解:API 优先级与公平调度(APF)排队参数实战指南
后端云原生容器编排【免费下载链接】pythonOfficial Python client library for kubernetes项目地址https://gitcode.com/gh_mirrors/python1/python点击查看免费下载本指南围绕 Kubernetes 官方 Python 客户端kubernetes中由 OpenAPI 自动生成的V1QueuingConfiguration模型展开深入讲解其在 API 优先级与公平调度API Priority and FairnessAPF机制中的作用、三个核心字段handSize、queueLengthLimit、queues的语义与默认值并给出基于仓库源码的序列化/反序列化调用示例与完整调用链。读完本文你将能够在 Python 中正确构造、解析和校验 PriorityLevelConfiguration 的排队配置对象并通过它们控制 Kubernetes API 服务器在过载时的请求排队行为。一、模型定位V1QueuingConfiguration 在 APF 机制中的角色V1QueuingConfiguration是 Kubernetes flowcontrol API 组flowcontrol.apiserver.k8s.io/v1中负责排队配置的模型。在 Kubernetes API 服务器处理请求过载时APF 机制将请求按优先级级别Priority Level隔离并通过「排队 限流」策略保护 API 服务器。当某个优先级级别的请求无法立即执行时就需要决定这些请求是进入队列等待Queue还是直接被拒绝Reject而进入队列后如何组织队列正是V1QueuingConfiguration要解决的问题。从当前仓库的源码结构可以清晰地看到这一模型的嵌套调用链V1PriorityLevelConfigurationSpeckubernetes/client/models/v1_priority_level_configuration_spec.py定义优先级级别的typeExempt/Limited以及limited字段V1LimitedPriorityLevelConfigurationkubernetes/client/models/v1_limited_priority_level_configuration.py通过limitResponse字段描述超限请求的处理方式V1LimitResponsekubernetes/client/models/v1_limit_response.py的type字段取Queue或Reject当取Queue时通过queuing字段引用V1QueuingConfigurationV1QueuingConfiguration最终定义队列数量、队列长度上限与 shuffle sharding 的分发手牌大小。也就是说V1QueuingConfiguration位于 APF 配置对象树的末端是描述「队列如何被组织」的核心叶子节点。在 kubernetes/client/models/v1_limit_response.py 中queuing被声明为Optional[V1QueuingConfiguration] None只有当typeQueue时才需要填充。二、三个核心字段语义、约束与默认值V1QueuingConfiguration只包含三个整型字段全部为Optional[StrictInt]可空、必须为严格整数。下表完整归纳了当前仓库源码kubernetes/client/models/v1_queuing_configuration.py中声明的字段语义字段Python 名线上 JSON 名wire name类型默认值语义与约束hand_sizehandSizeintint328shuffle sharding 分发的「手牌」大小。请求入队时其 flow identifier字符串二元组会被哈希哈希值用于洗牌队列列表并抽取指定大小的手牌请求进入该手牌中最短的队列。handSize必须不大于queues且应显著小于queues以避免少数重流量流heavy flows占满大多数队列。queue_length_limitqueueLengthLimitintint3250该优先级级别下单个队列允许等待的最大请求数超出部分直接拒绝。取值必须为正数。queuesqueuesintint3264该优先级级别的队列数量。队列在每个 API 服务器上独立存在取值必须为正数。设置为 1 时实际上禁用了 shuffle sharding使关联 FlowSchema 的 distinguisher 方法失去意义。上述默认值与约束同样完整体现在 OpenAPI 原始定义中见 scripts/swagger.json 中v1.QueuingConfiguration的定义三个属性均为format: int32, type: integer且字段描述中明确写明默认值 8 / 50 / 64。值得注意的设计细节是三个字段的默认值都由 API 服务器在服务端施加而不是由客户端模型在构造时填充。从源码看Field(defaultNone, ...)意味着客户端侧初始值为None模型注释明确写有 If not specified, it will be defaulted to ...。因此在编写客户端代码时你可以只设置需要覆盖的字段其余留空交给服务端默认。关于 shuffle sharding 的直观理解结合字段描述hand_size可以推导出 APF 排队的工作方式它不是简单地把请求轮流塞进固定队列而是为每个请求计算 flow identifier 的哈希从全部queues个队列中洗牌抽出handSize个候选队列再选择其中最短的一个入队。这样既能让流量分散到多个队列又能保证同一流flow的请求大体上落在一组固定的队列中从而兼顾公平性与吞吐量。handSize远小于queues时一个「重流」最多影响手牌范围内的队列不会耗尽所有队列容量——这正是字段描述中「should be significantly smaller」的原因。三、Python 命名与 JSON 命名的映射Alias 机制Kubernetes OpenAPI 的线上 JSON 字段采用驼峰命名handSize、queueLengthLimit、queues而 Python 模型遵循 PEP 8 采用蛇形命名hand_size、queue_length_limit、queues。仓库源码通过 pydantic 的AliasChoices与serialization_alias处理这套映射hand_size: Optional[StrictInt] Field( defaultNone, validation_aliasAliasChoices(handSize, hand_size), serialization_aliashandSize, )从 kubernetes/client/models/v1_queuing_configuration.py 可以看到attribute_map与openapi_types两个类变量openapi_types: ClassVar[Dict[str, str]] { hand_size: int, queue_length_limit: int, queues: int } attribute_map: ClassVar[Dict[str, str]] { hand_size: handSize, queue_length_limit: queueLengthLimit, queues: queues }这意味着入参反序列化时handSize与hand_size两种写法均可被接受出参序列化到线上格式时统一输出handSize、queueLengthLimit、queues三个驼峰键。模型配置kubernetes/client/models/v1_queuing_configuration.py同时开启了validate_by_nameTrue与validate_by_aliasTrue并设置了extraforbid即传入未声明的多余字段会直接报错避免拼写错误静默吞掉。四、完整的使用示例构造、序列化与反序列化以下代码全部基于当前仓库的公开 API 编写可直接在安装了本客户端的 Python 3 环境中运行同步客户端与异步客户端用法一致。4.1 从 JSON 字符串创建实例并打印参照 kubernetes/docs/V1QueuingConfiguration.md 中的示例模板from kubernetes.client.models.v1_queuing_configuration import V1QueuingConfiguration # 线上格式 JSON驼峰键 json_str {handSize: 4, queueLengthLimit: 40, queues: 32} v1_queuing_configuration_instance V1QueuingConfiguration.from_json(json_str) # 打印实例调用 to_dict 后的 pprint 形式 print(v1_queuing_configuration_instance) # 输出 JSON 字符串表示使用 alias即线上驼峰格式 print(V1QueuingConfiguration.to_json())4.2 从字典创建实例兼容两种键名由于AliasChoices(handSize, hand_size)的存在字典键既可以全部使用线上驼峰名也可以使用 Python 蛇形名甚至混用from kubernetes.client.models.v1_queuing_configuration import V1QueuingConfiguration # 使用线上键名 config V1QueuingConfiguration.from_dict({ handSize: 4, queueLengthLimit: 40, queues: 32, }) # 使用 Python 键名同样有效 config2 V1QueuingConfiguration( hand_size4, queue_length_limit40, queues32, ) print(config config2) # True两者等价from_dict在解析时会先经过__preprocess_input_nameskubernetes/client/models/v1_queuing_configuration.py做键名归一化若存在蛇形键但缺少驼峰键则自动把蛇形键的值复制到驼峰键上再交给 pydantic 校验。4.3 转回字典 / JSON 时使用线上格式to_dict()方法kubernetes/client/models/v1_queuing_configuration.py的行为与serialize参数相关config V1QueuingConfiguration(hand_size4, queue_length_limit40, queues32) # 默认serializeFalse返回 Python 蛇形键字典 # {hand_size: 4, queue_length_limit: 40, queues: 32} print(config.to_dict()) # serializeTrue返回线上驼峰键字典 # {handSize: 4, queueLengthLimit: 40, queues: 32} print(config.to_dict(serializeTrue))而to_json()始终输出线上格式驼峰键可直接作为PriorityLevelConfiguration的spec.limited.limitResponse.queuing字段内容提交给 Kubernetes API。4.4 在完整 APF 配置中组装 V1QueuingConfiguration要把排队配置真正落到一个 PriorityLevelConfiguration 上需要沿着第三节介绍的调用链逐层组装。下面给出一个完整的构造示例对应关系可对照 kubernetes/client/models/v1_priority_level_configuration_spec.pylimited字段、kubernetes/client/models/v1_limited_priority_level_configuration.pylimitResponse字段与 kubernetes/client/models/v1_limit_response.pyqueuing字段from kubernetes.client.models.v1_queuing_configuration import V1QueuingConfiguration from kubernetes.client.models.v1_limit_response import V1LimitResponse from kubernetes.client.models.v1_limited_priority_level_configuration import V1LimitedPriorityLevelConfiguration from kubernetes.client.models.v1_priority_level_configuration_spec import V1PriorityLevelConfigurationSpec from kubernetes.client.models.v1_priority_level_configuration import V1PriorityLevelConfiguration from kubernetes.client.models.v1_object_meta import V1ObjectMeta queuing V1QueuingConfiguration( hand_size4, # 默认 8应远小于 queues queue_length_limit40, # 默认 50 queues32, # 默认 64置 1 将禁用 shuffle sharding ) limit_response V1LimitResponse( typeQueue, queuingqueuing, ) limited V1LimitedPriorityLevelConfiguration( nominal_concurrency_shares30, limit_responselimit_response, ) spec V1PriorityLevelConfigurationSpec( typeLimited, limitedlimited, ) plc V1PriorityLevelConfiguration( api_versionflowcontrol.apiserver.k8s.io/v1, kindPriorityLevelConfiguration, metadataV1ObjectMeta(namemy-priority-level), specspec, ) # 打印最终对象的线上 JSON可提交给 API 服务器 print(plc.to_json())对应生成的 YAML 结构供与 kubectl 场景对照客户端序列化为 JSON 而非 YAMLapiVersion: flowcontrol.apiserver.k8s.io/v1 kind: PriorityLevelConfiguration metadata: name: my-priority-level spec: type: Limited limited: nominalConcurrencyShares: 30 limitResponse: type: Queue queuing: handSize: 4 queueLengthLimit: 40 queues: 32五、同步与异步客户端模型完全一致V1QueuingConfiguration同时存在于同步与异步两套客户端中二者内容完全一致同步版kubernetes/client/models/v1_queuing_configuration.py异步版kubernetes/aio/client/models/v1_queuing_configuration.py对比两个文件可以看出字段声明、attribute_map、__properties与全部方法to_str、to_json、from_json、to_dict、from_dict、__eq__、__ne__均保持同步异步客户端使用from kubernetes.aio.client.models.v1_queuing_configuration import V1QueuingConfiguration即可。这一点也与本文所依据的 Sphinx 文档源 doc/source/kubernetes.aio.client.models.v1_queuing_configuration.rst 的主题一致——该文档正是异步客户端的automoduleAPI 文档页通过:members:与:undoc-members:指令将上述全部成员含私有辅助方法纳入文档。此外V1QueuingConfiguration已通过 kubernetes/client/models/init.py 注册为kubernetes.client.models的公开导出成员并映射到v1_queuing_configuration模块kubernetes/client/models/init.py因此也可以直接写from kubernetes.client.models import V1QueuingConfiguration。六、模型实现的底层要点pydantic 与严格校验从源码层面看本模型的实现有几个值得注意的技术点kubernetes/client/models/v1_queuing_configuration.py继承 pydantic 的BaseModel模型声明基于 pydantic v2 的ConfigDict开启validate_by_name支持按字段名校验、validate_by_alias支持按别名校验、validate_assignment赋值时即时校验与extraforbid禁止未声明字段。严格整数StrictInt三个字段使用StrictInt传入浮点数或可隐式转换的字符串会被拒绝确保与 OpenAPI 中int32的类型声明严格一致。to_dict的双模式输出默认输出 Python 蛇形键字典serializeTrue时输出线上驼峰键字典兼顾代码可读性与线上格式。__eq__/__ne__基于字典比较两个实例的相等性通过to_dict()结果比较判定与字段内容而非对象引用挂钩。JSON 往返对称from_json→to_json保持线上格式对称from_dict→to_dict则在蛇形与驼峰键之间往返。由于生成的模型文件头部标注 Do not edit the class manuallykubernetes/client/models/v1_queuing_configuration.py这些实现由 OpenAPI Generator 从release-1.37版本的 OpenAPI 文档见文件头注释与 scripts/swagger.json自动生成你在升级客户端版本时无需手工维护模型代码。七、调参建议与常见陷阱结合字段语义与源码约束给出以下实战建议均以当前仓库声明的字段描述为依据不涉及服务端未公开的细节queues置 1 的后果字段描述明确指出queues1会「effectively precludes shuffle sharding」使关联 FlowSchema 的 distinguisher 方法失效——所有请求进同一队列仅剩队列长度限制兜底此时应确认是否真的需要禁用分片。handSize与queues的关系handSize必须不大于queues且应显著更小。若把handSize设得过大少量重流可能占据手牌覆盖的多数队列削弱隔离效果。默认值依赖服务端客户端模型的字段默认值为None未设置字段时服务端会按 8 / 50 / 64 补齐。若你的场景需要不同取值务必显式设置后再提交。键名混用问题构造字典时可以混用handSize与hand_size但extraforbid意味着任何第三个键如笔误的handsize都会触发校验错误调试时注意报错信息会直接指出未知字段。queueLengthLimit超限行为字段描述说明「excess requests are rejected」即队列溢出请求会被直接拒绝而非无限等待这与V1LimitResponse的type字段Queue/Reject是两个不同层级的决策——前者决定「是否排队」后者决定「排队后队列溢出怎么办」。结语V1QueuingConfiguration虽只有三个字段却是 Kubernetes APF 机制中控制请求排队行为的关键配置点。通过本文的源码级拆解可以看到它在 kubernetes/client/models/v1_queuing_configuration.py 中是一个完全由 OpenAPI 驱动、pydantic 严格校验的成熟模型正确理解handSize/queueLengthLimit/queues的语义、默认值与线上 JSON 映射能够帮助你在 Python 环境中精确地构造、校验并提交 PriorityLevelConfiguration从而在高负载场景下为不同优先级的 API 请求提供可控的排队与隔离策略。如果需要更完整的模型清单与示例模板可继续阅读 kubernetes/docs/V1QueuingConfiguration.md 及kubernetes/docs目录下对应的 API 文档。赞分享后端云原生容器编排【免费下载链接】pythonOfficial Python client library for kubernetes项目地址https://gitcode.com/gh_mirrors/python1/python点击查看免费下载相关推荐Kubernetes Python 客户端中的 FlowcontrolV1Subject 模型API 优先级与公平调度APF请求发起方匹配完全指南Kubernetes Python 客户端中的 FlowcontrolV1Subject 模型API 优先级与公平调度APF请求发起方匹配完全指南 本篇技后端云原生容器编排Kubernetes Python 客户端V1MutatingAdmissionPolicyBinding 模型详解与 admissionregistration.k8s.io/v1 API 实战Kubernetes Python 客户端V1MutatingAdmissionPolicyBinding 模型详解与 admissionregistrati后端云原生容器编排date-fns 北萨米语selocale 完整指南格式化令牌、解析行为与距离本地化date fns 北萨米语selocale 完整指南格式化令牌、解析行为与距离本地化 本文基于 date fns 仓库中 pkgs/core/src/lo后端云原生容器编排上一篇3分钟快速上手文字转手写工具终极指南 - 免费本地生成逼真手写笔记下一篇3分钟掌握Visual Syslog ServerWindows系统日志监控终极解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

AI时代新范式:企业如何应用BI系统结合大模型实现智能问数

AI时代新范式:企业如何应用BI系统结合大模型实现智能问数

一、数据“看得到”却“用不上”:企业面临的真实困境企业在数据基础设施上的投入持续增长,但数据转化为业务价值的效率并未同步提升。据《全国数据资源调查报告(2025年)》显示,2025年全国年度数据生产总值达52.26泽字节…

2026/10/10 21:13:01 阅读更多 →
新能源汽车电子元器件采购:车规级AEC-Q100检测看什么?

新能源汽车电子元器件采购:车规级AEC-Q100检测看什么?

新能源汽车元器件单价高、可靠性要求严、批次追溯要求严——一辆新能源车上的电子元器件超过3000颗,任何一颗失效都可能导致召回。车规级元器件采购的核心是AEC-Q100检测,看懂AEC-Q100报告才能判断一颗芯片能不能上车。一、AEC-Q100 是什么AEC-Q100 是汽…

2026/10/10 21:13:01 阅读更多 →
6天3.1k星、一小时涨50颗:SemIf 凭什么让程序员重新审视 if 语句

6天3.1k星、一小时涨50颗:SemIf 凭什么让程序员重新审视 if 语句

6天3.1k星、一小时涨50颗:SemIf 凭什么让程序员重新审视 if 语句 【免费下载链接】SemIf-OpenJev Semantic ifs from open models, on a 3090 at home. Independent; not affiliated with Jev or TypeSafe. 项目地址: https://gitcode.com/gh_mirrors/op/SemIf-Op…

2026/10/10 21:13:01 阅读更多 →

最新新闻

广州粤大师老车内饰翻新性价比怎么样,收费合理吗

广州粤大师老车内饰翻新性价比怎么样,收费合理吗

从手作工坊到一站式改装平台,广州粤大师的八年匠心深耕岁月流转,汽车后市场的风潮起起落落,从早年零散的汽配城作坊,到如今越来越多车主看重工艺质感与透明服务,整个行业在十几年间发生了翻天覆地的变化。对于情怀老车…

2026/10/10 21:53:42 阅读更多 →
2026 集成电路网站建设公司推荐-技术方案展示与工程师视角的十家观察

2026 集成电路网站建设公司推荐-技术方案展示与工程师视角的十家观察

下列十家服务商都能承接集成电路方向的网站建设,先集中列出便于对照:易百讯科技(深圳,2010 年成立,综合型建站服务商)、方维网络(深圳本土,网站建设与小程序开发并行)、助…

2026/10/10 21:53:42 阅读更多 →
进口冷链到货要核对哪些单证?证明文件和追溯信息清单

进口冷链到货要核对哪些单证?证明文件和追溯信息清单

进口冷链到货要核对哪些单证?证明文件和追溯信息清单接进口冷链货,和国产货最大的不同就是“先验证、再卸货”。证明文件不齐、追溯信息对不上的货,贸然收下等于把风险接进自己库里。各地对进口冷链的监管要求会动态调整,到货核对…

2026/10/10 21:53:42 阅读更多 →
从 v0.1 到 v1.0.0:Spec Kit 一年演进史,GitHub 官方把「规范驱动」从口号做成了产品

从 v0.1 到 v1.0.0:Spec Kit 一年演进史,GitHub 官方把「规范驱动」从口号做成了产品

从 v0.1 到 v1.0.0:Spec Kit 一年演进史,GitHub 官方把「规范驱动」从口号做成了产品 【免费下载链接】spec-kit 💫 Toolkit to help you get started with SDD or any other process! 项目地址: https://gitcode.com/GitHub_Trending/sp/s…

2026/10/10 21:53:42 阅读更多 →
Spring容器核心机制:Bean生命周期、依赖注入与循环依赖实战解析

Spring容器核心机制:Bean生命周期、依赖注入与循环依赖实战解析

上期我们把 Spring 容器的基本用法过了一遍,这次直接聊容器内部。别慌,不是让你去背源码,而是把 Bean 的生命周期、依赖注入的判定逻辑、循环依赖这类面试高频和线上事故高发区一次性讲透。我自己带项目这两年,见过不止一次因为对…

2026/10/10 21:53:41 阅读更多 →
实测 openPangu 2.0 的 512K 超长上下文:百万字文档喂进去,输出会不会崩?

实测 openPangu 2.0 的 512K 超长上下文:百万字文档喂进去,输出会不会崩?

实测 openPangu 2.0 的 512K 超长上下文:百万字文档喂进去,输出会不会崩? 【免费下载链接】openPangu-2.0-Pro 昇腾原生的openPangu-2.0-Pro语言模型 项目地址: https://ai.gitcode.com/ascend-tribe/openPangu-2.0-Pro "512K 上…

2026/10/10 21:52:41 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →