2026-04-26
FastAPI
00

在FastAPI中创建高性能的ASGI中间件来记录响应时间

在现代Web应用开发中,性能监控是一个关键环节。了解每个请求的处理时间可以帮助我们识别性能瓶颈,优化系统表现。本文将详细介绍如何在FastAPI中创建一个高性能的ASGI中间件来记录HTTP响应时间。

什么是ASGI中间件?

ASGI(Asynchronous Server Gateway Interface)是Python异步Web服务器和应用程序之间的标准接口。ASGI中间件是一种特殊的组件,它位于Web服务器和应用程序之间,可以拦截和处理请求与响应。

为什么需要自定义中间件?

虽然FastAPI提供了许多内置功能,但有时我们需要添加特定的业务逻辑,如:

  • 性能监控
  • 日志记录
  • 身份验证
  • 请求/响应修改
2026-03-10
Python
00

Python 实现多线程主要靠 threading 模块。最常用的两种方式:一是直接给 threading.Thread 传一个 target 函数,二是继承 Thread 类然后重写 run 方法。

Python
import threading import time def print_numbers(): for i in range(5): print(f'Number: {i}') time.sleep(1) def print_letters(): for letter in 'abcde': print(f'Letter: {letter}') time.sleep(1) # 创建线程 thread1 = threading.Thread(target=print_numbers) thread2 = threading.Thread(target=print_letters) # 启动线程 thread1.start() thread2.start() # 等待线程结束 thread1.join() thread2.join() print('Done.')

上面这段代码创建了两个线程分别跑 print_numbers 和 print_letters。调用 start() 让线程开始执行,join() 则是让主线程等着子线程跑完再继续往下走。

线程的生命周期大致是:创建线程对象 → 调用 start() 进入就绪状态 → 获取 CPU 时间片开始执行 → 执行完毕或遇到 join() 等待 → 线程结束

2026-03-10
Python
00

核心思路就是分而治之,不要把整个文件一股脑儿塞进内存,而是一点一点地读、一点一点地处理。

Python 提供了两种主流方案:逐行读取分块读取

  • 逐行读取适合文本文件,每次只在内存里放一行数据
  • 分块读取适合二进制文件或需要固定大小处理的场景,每次读指定字节数。

两种方式都能把 8G 文件的内存占用压到几 KB 到几 MB 级别。

2026-03-10
Python
00

Python 的继承就是让一个类直接拿到另一个类的属性和方法,不用重复写一遍。子类继承父类之后,父类有的东西子类全都能用,想改就重写对应的方法就行。

Python 跟 Java 不一样的地方在于它支持 多继承,一个子类可以同时继承多个父类。多继承虽然灵活,但也带来了方法冲突的问题,Python 用 MRO 来确定方法调用顺序。来看个最直观的例子:

2026-03-10
Python
00

背景:消失的文件

在使用 Python 的 requests 库上传文件时,如果文件名包含中文,你可能会遇到一个诡异的问题:

  • 本地调试:代码运行正常,没有任何报错。
  • 服务端表现:对方声称根本没有收到文件(File 字段为空),或者收到的文件名是一串乱码(如 filename*=utf-8''...)。

即便你尝试了 encode('utf-8').decode('latin-1') 等常规编码转换,问题依然可能存在。