Tag

#Python

包含这个标签的文章。

开发 35 阅读

Python 请求参数串数据:可变默认值与浅拷贝的定位和修复

一个报表接口连续执行两次:第一次查询订单,第二次查询库存。库存请求却带上了订单请求追加的字段。重启进程后暂时恢复,压测时又复现。数据库查询本身没有问题,污染发生在构造查询参数之前。 这类故障不一定需要并发:同一进程中两个顺序调用就能触发。本文用纯 Python 标准库复现并修复,适用于长期运行的 Web 服务、任务 W

阅读全文
开发 74 阅读

Python CSV 导入静默丢列:重复表头、BOM 与行宽异常的定位和修复

库存调整 CSV 看起来有三列,导入后却只剩两个字段;另一份文件的 sku 明明存在,程序却报 KeyError。这类问题先查文件边界,别急着给字典取值加默认值。默认值会把格式错误变成库存错误。 本文约定一个具体接口:上传 UTF-8 的 CSV,列为 sku,quantity,note,SKU 只能包含大写字母、数字

阅读全文
开发 124 阅读

Python 金额差一分钱:从 float 输入污染到 Decimal 舍入边界

场景:计算结果没报错,核对总额却对不上 订单预览、费用计算和导出报表里,容易出现两种相似的现象:2.675 保留两位变成 2.67;两条 0.335 的明细分别显示 0.34,总计却显示 0.67。前者可能是输入已经经过二进制浮点数,后者可能是逐行舍入与汇总舍入的口径不同。只把所有变量换成 Decimal,解决不了第二

阅读全文
开发 155 阅读

Python 日志一条变两条:从 handler 重复注册到传播链修复

适用场景与现象 适用于 Python 3.10 及以上的命令行程序、后台任务和自有服务。业务代码只调用一次 logger.info(),同一进程的原始输出却出现两行;或者应用工厂每执行一次,同一事件就多输出一遍。 先分清重复发生在哪一层:若进程的 stderr 只有一条,而日志平台出现两条,优先检查采集路径是否同时包含

阅读全文
安全 185 阅读

Python 解压不可信 ZIP:同时防住路径穿越、符号链接与解压炸弹

适用场景 本文适用于允许用户上传 ZIP 的报表导入、主题包安装、批量图片处理和离线数据交换服务。压缩包来自外部时,风险不只是文件名中出现 ../:绝对路径、Windows 盘符、反斜杠、同名覆盖、Unix 符号链接以及极高压缩比,都可能让一次普通解压变成任意文件写入或磁盘耗尽。 目标是建立一个可验收的解压边界:先检查

阅读全文
开发 197 阅读

Python 调用遗留命令乱码又卡死:字节解码、超时与安全参数实践

适用场景 本文适用于 Python 3.11 及以上版本。业务程序需要调用数据库备份工具、硬件厂商 CLI、Windows 遗留程序或内部运维命令,但这些程序的输出编码不是 UTF-8,并且可能出现长时间无响应、非零退出、输出管道堵塞或参数注入风险。 目标不是再封装一层 subprocess.run(),而是建立一个可

阅读全文
Python 223 阅读

HTTPX 流式响应偶发 PoolTimeout:从连接未释放到生命周期闭环

Python 服务用 HTTPX 转发大文件、对象存储下载或上游 SSE 时,通常会启用流式响应,避免把整个响应体读入内存。上线后却可能出现一种很迷惑的故障:服务启动时一切正常,运行一段时间后请求开始批量报 httpx.PoolTimeout;重启进程能暂时恢复,单纯调大连接池只能延后复发。 这类问题往往不是上游连接慢

阅读全文
Python 306 阅读

Python asyncio 优雅停机卡住:从取消信号被吞到结构化并发治理

适用场景与现象 异步消费者、WebSocket 网关或定时任务服务收到 SIGTERM 后,健康检查已经失败,进程却迟迟不退出,最终被 Kubernetes 在宽限期结束时强制 SIGKILL。常见伴随现象是: 停机日志只出现“开始关闭”,没有“后台任务已结束”; 某个任务仍处于 PENDING,但业务请求已经停止进入

阅读全文
开发 386 阅读

Django 新订单偶发查询不到:Celery 任务早于事务提交的排查与修复

Django 新订单偶发“查询不到”:Celery 任务早于事务提交的排查与修复 适用场景与现象 下单接口先写入订单,再让 Celery Worker 发送确认邮件。接口返回成功,Worker 却偶发 Order.DoesNotExist;在管理后台查询,同一订单已经存在。失败多发生在数据库写入较慢、Worker 较空

阅读全文
Python 396 阅读

Python 服务内存持续增长:用 tracemalloc 快照差分定位无界缓存

适用场景 一个常驻的 Python API、消费者或定时任务进程,刚启动时只占用几百 MB,运行数小时后内存持续上涨。请求结束后内存没有明显回落,重启可以暂时恢复,但过一段时间又出现同样问题。监控最终触发容器 OOMKilled,或节点开始频繁交换内存。 本文针对“对象仍被 Python 引用”的增长场景,演示如何用标

阅读全文