Fastapi Background Tasks

Background Tasks 后台任务 你可以定义一个在返回响应之后运行的后台任务。 这对请求之后执行一些操作十分有用,客户端无需一直等待操作任务完成再接收响应。 这包含一些例子: 执行操作后发送电子邮件 由于连接邮件服务器并发送邮件一般会比较“慢”(几秒钟),你可以立刻返回响应并在后台发送邮件请求。 处理数据 例如,你收到了一个文件需要缓慢处理,你可以返回一个 “Accepted” 响应 (HTTP 202) 并在后台处理文件。 Using Background Tasks 使用后台任务 首先要导入 BackgroundTasks 并在执行函数中定义一个路径参数,使用 BackgroundTasks 类型声明。 from fastapi import BackgroundTasks, FastAPI app = FastAPI() def write_notification(email: str, message=""): with open("log.txt", mode="w") as email_file: content = f"notification for {email}: {message}" email_file.write(content) @app.post("/send-notification/{email}") async def send_notification(email: str, backgroud_tasks: Background(Tasks): # Add parameter here background_tasks.add_task(write_notification, email, message="some notification") # add backgroud task here return {"message": "Notification sent in the background"} Create a task function 创建任务函数 创建一个函数放到后台运行,只是一个接收参数的基本函数,可以是 async def 或者就普通的 def 函数,FastAPI 会正确的处理它。 在这个例子中的任务函数将会编写文件,并且写入操作不使用 async 或 await 故使用 def 定义了一个基本的函数。 ...

October 10, 2025 · 2 min · 261 words · Starslayerx

Fastapi Middleware

Middleware 你可以添加中间件到 FastAPI 应用中。 “中间件” 是一个函数,它在每个请求被特定路径操作之前对其进行处理,同时在每个响应返回之前也对其进行处理。 在到达应用程序之前处理请求 可以在请求中做一些事情,或运行任何需要的代码 将处理后的请求传递给应用程序 之后处理应用程序返回的响应 可以对响应做一些事情,或运行任何需要的代码 然后返回响应 Create a Middleware 创建一个中间件 想要创建一个中间件,你可以在函数上面使用装饰器 @app.middleware("http"),该函数接受: request 请求 一个函数 call_next 并将会接收 request 作为一个参数 该函数会将 request 传递给对应的路径操作 然后返回对应路由操作生成的 response 你可以修改或者直接返回 response import time from fastapi import FastAPI, Request app = FastAPI() @app.middleware("http") async def add_process_time_header(request: Request, call_next): ... TIP 自定义专属 headers 可以使用 X-prefix 来添加。 但如果你有一个自定义的 header 并想要客户端能够看到这些信息,你需要使用 Starlette’s CORS docs 中的参数参数 expose_headers 将其加入你的 CORS 设置里 (CORS (Corss-Origin Resource Sharing))。 Before and after the response 在响应前后 你也可以在 request 前后运行代码,也可以在 response 前后运行代码。 ...

October 9, 2025 · 1 min · 164 words · Starslayerx

Python Standrad Library - File and Directory Access - pathlib

pathlib - Object-oriented filesystem paths 此模块提供表示文件系统路径的类,其语义适用于不同的操作系统。 路径类分为: 用于纯计算无 I/O 的 pure paths 继承 pure paths 但是有 I/O 操作的 concrete paths 基本使用 导入 Path from pathlib import Path p = Path('.') 列出所有子目录 [x for x in p.iterdir() if x.is_dir()] 列出所有 py 源码文件 list(p.glob('**/*.py')) 在目录树中移动 p = Path('/etc') q = p / 'init.d' / 'reboot' # .resolve() 方法会解析所有符号链接,返回文件绝对路径 # mac os 中的 /etc 实际上是一个符号链接,指向 /private/etc q.resolve() 查询文件路径 q.exists() # 文件是否存在 q.is_dir() # 是否为目录 打开一个文件 q = Path('.') / 'file.py' with q.open() as f: # 读取第一行内容 f.readline() Pure paths 纯路径 Pure path 对象提供路径处理操作,这些操作无需真的访问操作系统。 有三种方法来操作这些类,也被称为 flavours (风格): class pathlib.PurePath(*pathsegemnts) 为一个通用的类,代表当前系统的路径风格 >>> PurePath('setup.py') PurePosixPath('setup.py') pathsegments 的每个元素即可以是代表一个路径的字符串,也可以是实现了 os.PathLike 接口的对象,其中 fspath() 方法返回一个字符串,例如另一个路径对象: ...

October 3, 2025 · 9 min · 1706 words · Starslayerx

Docker - Containers

像 VMware 或 KVM 这类虚拟化系统, 他们运行在虚拟化层上运行完整的 Linux 内核与操作系统. 这种架构能提供极强的隔离性, 因为每个虚拟机都搭载独立的内核, 这些内核各自运行在硬甲虚拟化层之上的隔离内存空间中. 而容器技术有着根本性差异, 所有容器共享同一个内核, 工作负载间的隔离性全通过内核机制实现, 这种模式被称为操作系统级虚拟化 operating system virtualization. runc/libcontainer 提供了一个很好的定义: A container is a self-contained execution environment that shares the kernel of the host system and is isolated from other containers in the system. 容器最大的优势就在于性能, 当运行一个进程的时候, 只有小部分的代码在内核中用于管理容器. 如今, 容器几乎在任何地方运行. Docker 和 OCI 镜像提供了生成环境中软件的打包格式, 并为 Kubernetes 和大多数 “serverless” 云技术打下了基础. 所谓的 serverless 技术并不是真的没有服务器: 它们依赖其他人的服务器来完成工作, 这样应用开发者就无需关心管理硬甲和操作系统了. Creating a Container 创建容器的命令 docker container run 实际上是包装在一起的两条命令. 第一件事是从基本的镜像中创建一个容器, 可以通过 docker container create 命令实现. 第二件事是执行容器, 同样地, 可以通过 docker container start 命令实现. ...

September 23, 2025 · 9 min · 1877 words · Starslayerx

uv - Python package manager

这篇文章深入介绍 uv 管理 Python 项目的使用 Features Python versions uv python install: 安装 Python 版本 uv python list: 查看可用的 Python 版本 uv python find: 查找安装的 Python 版本 uv python pin: 固定当前项目的 Python 版本 uv python uninstall: 卸载一个 Python 版本 Scripts uv run: 运行一个脚本 uv add --script: 为脚本添加一个依赖 uv remove --script: 移除一个依赖 Projects 使用 pyproject.toml 配置项目 uv init: 创建一个 Python 项目 uv add: 为项目添加依赖 uv remove: 删除项目依赖 uv sync: 同步环境下的依赖 uv lock: 为项目依赖创建一个锁文件 uv run: 在项目环境执行命令 uv tree: 查看项目依赖树 uv build: 将项目构建为分发归档文件 uv publish: 将项目发布到包索引 Tools 允许与安装工具 ...

September 22, 2025 · 11 min · 2131 words · Starslayerx

Morden Javascript Tutorial Chapter 2 - Fundamentals: 11~18

2.11 Logical operators There are four logical operators in JavaScript: || (ORA), && (AND), ! (NOT), ?? (Nullish Coalescing 空值合并). || OR result = a || b There are four logical combinations: alter( true || true ); // true alert( false || true ); // true alert( true || false ); // true alert( false || false ); // false If an operand is not a boolean it’s converted to be a boolean for the evaluation. if (1 || 0) { // works like (true || false) alter('truthy!'); } OR “||” finds the first truthy value result = value1 || value2 || value3 The OR || operator does the following: ...

September 21, 2025 · 22 min · 4603 words · Starslayerx

English for Programmers - 03

Unit 3. Discussing Code vocabulary - Modifiers When discussing code, modifiers can be extremely useful for making your feedback constructive and precise. modifiers: words that change the meaning of a sentence For example, a colleague asks: What do you think of the website? Response 1: It’s good When I click something it loads very quickly and I can navigate it easyily without any instructions. Response 2: It’s good! It’s very responsive and can be navigated intuitively. ...

September 20, 2025 · 2 min · 390 words · Starslayerx

Redis Bitmap

Bitmap 位图 Redis 的位图 bitmap 是由多个二进制位组成的数组, 数组中的每个二进制都有与之对应的偏移量(索引), 用户通过这些偏移量可以对位图中指定的一个或多个二进制位进行操作. Redis 为位图提供了一系列操作命令, 通过这些命令, 用户可以: 设置或获取索引位上的二进制值 统计位图中有多少个二进制位被设置成了1 查找位图中, 第一个被设置为指定值的二进制位, 并返回其偏移量 对一个或多个位图执行逻辑并、逻辑或、逻辑异或以及逻辑非运算 将指定类型的整数存储到位图中 SETBIT: 设置二进制位的值 SETBIT bitmap offset value 为位图指定偏移量上的二进制位设置值, 该命令会返回二进制位被设置之前的旧值作为结果. 当执行 SETBIT 时, 如果位图不存在, 或者位图当前的大小无法满足用户想要执行的设置操作, 那么 Redis 将对被设置的位图进行扩展, 使得位图可以满足用户的设置请求. 由于位图的扩展以字节为单位, 所以扩展后的位图包含的二进制数量可能会比用户要求的稍多一些. 且在扩展的同时, 会将未设置的二进制位初始化为 0. 与一些可以使用负数的 Redis 命令不同, SETBIT 命令只能使用正数偏移量, 尝试输入负数作为偏移量将引发一个错误 复杂度: O(1) GETBIT: 获取二进制位的值 GETBIT bitmap offset 与 SETBIT 命令一样, GETBIT 命令也只能接受正数作为偏移量. 对于偏移量超过位图索引的命令, GETBIT 命令将返回 0 作为结果. 复杂度: O(1) BITOCUNT: 统计被设置的二进制数量 BITCOUNT key 对于值为 10010100 的位图 bitmap001, 可以通过执行以下命令来统计有多少个二进制位被设置成了1: ...

September 19, 2025 · 5 min · 1009 words · Starslayerx

Redis HyperLogLog

之前曾介绍过使用 Redis 集和构建唯一计数器, 并将这个计数器用于计算网站的唯一房客 IP. 虽然使用集和实现唯一计数器可以实现该功能, 但这个方法有一个明显的缺陷: 随着被计数元素的不断增多, 唯一计数器占用的内存也会越来越大; 计数器越多, 他们的体积越大, 这一情况就会越严峻. 以计算唯一访客 IP 为例: 存储一个 IPv4 格式的 IP 地址最多需要 15 个字节 根据网站的规模不同, 每天出现的唯一 IP 可能会有数十万、数百万个 为了记录网站在不同时期的访客, 并进行相关的数据分析, 网站可能需要次序地记录每天的唯一访客 IP 数量 综上, 如果一个网站想要长时间记录访客 IP, 就必须创建多个唯一计数器. 如果访客比较多, 那么它创建的每个唯一计数器都将包含大量元素, 并因此占用相当一部分内存. 为了高效解决计算机唯一访客 IP 数量这类问题, 其中一种方法就是 HyperLogLog. HyperLogLog 简介 HyperLogLog 是一个专门为了计算集和的基数而创建的概率算法, 对于一个给定的集和, HyperLogLog 可以计算出这个集合的近似基数: 近似基数并非集和的实际基数, 它可能会比实际的基数大一点或者小一点, 但误差会在一个合理范围内. 因此, 那些不需要知道实际基数的程序就可以把这个近似基数当作集合的基数来使用. HyperLogLog 的优点在于计算近似基础所需的内存并不会因为集和的大小而改变, 无论集和包含元素有多少个, HyperLogLog 进行计算所需的内存总是固定的, 无论集和包含元素多少个, HyperLogLog 进行计算所需的内存总是固定的, 并且是非常少的. PFADD: 对集和元素进行计数 PFADD hyperloglog element [element ...] 根据给定元素是否已经进行过计数, PFADD 命令可能返回0, 也可能返回1: ...

September 18, 2025 · 3 min · 456 words · Starslayerx

Morden Javascript Tutorial Chapter 2 - Fundamentals: 06~10

2.6 Interaction: alert, prompt, confirm Will introduce alert, prompt and confirm in this chapter. alert It shows a message and waits for the user to press “OK”. alert("Hello"); prompt This function prompt accepts two arguments result = prompt(title, [default]); It shows a modal window with a text message, an input field for the visitor, and the buttons OK/Cancel. title: The text to show the visitor. default: An optional second parameter, the initial value for the input field. ...

September 17, 2025 · 15 min · 3118 words · Starslayerx