Fastapi Cookie and Header Parameters

这篇文章介绍 Fastapi 的 Cookie 和 Header 参数 Cookie Parameters 通过定义 Query 和 Path 参数一样定义 Cookie 参数 from typing Annotated from fastapi import Cookie, FastAPI app = FastAPI() @app.get("/items/") async def read_items(ads_id: Annotated[str | None, Cookie()] = None): return {"ads_id": ads_id} Cookie Parameters Models 如果有一组相关的 cookies, 可以使用 Pydantic model 来声明. 这样可以在多个部分复用这个模型, 同时还能一次性为所有参数声明验证规则和元数据. 下面使用 Pydantic 模型定义 Cookies, 然后将参数声明为 Cookie from typing import Annotated from fastapi import FastAPI, Cookie from pydantic import BaseModel app = FastAPI() class Cookie(BaseModel): session_id: str fatebook_tracker: str | None = None googall_tracker: str | None = None @app.get("/items/") async def read_items(cookies: Annotated[Cookies, Cookie()]): return cookies Forbid Extra Cookies 禁止额外的Cookie 在某些场景下(虽然并不常见), 可能希望限制 API 只能接收特定的 Cookie. 这样, API 就可以"自己"管理 Cookie 同意策略了. from typing import Annotated from fastapi import FastAPI, Cookie from pydantic import BaseModel app = FastAPI() class Cookies(BaseModel): model_config = {"extra": "forbid"} # forbid extra cookies session_id: str fatebook_tracker: str | None = None googall_tracker: str | None = None @app.get("/items/") async def read_items(cookies: Annotated[Cookies, Cookie()]): return cookies 这样, 如果客户端发送额外的 cookies, 则会收到一个错误响应. 例如, 客户端发送了 santa_tracker 这个额外 Cookie ...

August 11, 2025 · 3 min · 499 words · Starslayerx

Python Function Parameters

今天是周日, 简单写点吧, 简单总结一下 Python 中函数参数 Python Function Parameters Python 函数参数机制非常灵活丰富, 理解各种参数类型及其用法对于写出优雅、易维护的代码非常重要. 本文将介绍 Python 中函数参数的种类与用法, 并详细讲解 Python 3.8 引入的参数分隔符 / 和 *, 帮助你更好地设计函数接口. 1. Postional Arguments 位置参数 函数定义中最常见的参数, 调用时按顺序传入值 def greet(name, age): print(f"Hello, {name}. You are {age} years old.") greet("Alice", 30) # Hello, Alice. You are 30 years old. 2. Keyword Arguments 关键字参数 调用时以 key=value 形式传入, 顺序可变 greet(age=30, name="Alice") 3. Default Arguments 默认参数 定义函数时给参数赋默认值, 调用时可省略 def greet(name, age=20): print(f"Hello, {name}. You are {age} years old.") greet("Bob") # 使用默认年龄20 greet("Bob", 25) # 指定年龄 注意: 使用默认参数尽量不要使用可变类型(mutable), 例如列表, 因为默认参数是存储在函数中的, 而非函数实例中, 多次调用会改变默认值的内容. def greet(names: list[str] = ["Alice", "Bob"]): ... 若希望使用默认值, 建议使用下面这种方法 ...

August 10, 2025 · 2 min · 278 words · Starslayerx

FastAPI Body Advanced Uses

本篇文章介绍 FastAPI Request Body 的进阶用法 Body - Multiple Parameters 首先, 可以将Path, Query 和 request body 参数声明自由的写在一起 对于 request body 参数可以是可选的, 并且可设置为默认的 None from typing import Annotated from fastapi import FastAPI, Path from pydantic import BaseModel app = FastAPI() class Item(BaseModel): name: str description: str | None = None price: float tax: float | None = None @app.put("/items/{item_id}") async def update_item( item_id: Annotated[int, Path(title="The ID of the item to get", ge=0, le=1000)], # Path q: str | None = None, # Query item: Item | None = None, # body ): results = {"item_id": item_id} if q: results.update({"q": q}) if item: results.update({"item": item}) return results Multiple body parameters 多参数请求体 在上面例子中, FastAPI 期望一个包含 Item 属性的 JSON body, 例如 { "name": "Foo", "description": "The pretender", "price": 42.0, "tax": 3.2 } 但也可以声明多个body parameters, 例如 item 和 user ...

August 9, 2025 · 5 min · 911 words · Starslayerx

Git Whitelist

有时你开启了一个新的项目, 运行了 cargo init、uv init 和 go mod init 这些命令创建了工作所需要的必要文件, 同时也在 .gitignore 文件中添加了以下内容 target __pycache__ bin 一切都很顺利, 你继续开发新功能, 等到时机成熟时就将项目发布到了 Git 托管平台上 人们开始对你的项目感兴趣, 甚至有人决定为你实现一个新功能, 这简直是免费劳动力! 当你查看代码, 发现了一个格格不入的文件 .DS_Store, 你问那个人这是什么, 他说他根本不知道 然后你只是将该文件从分支里面删除, 并把文件名加入了仓库的 .gitignore target __pycache__ bin .DS_Store 现在代码合并到了 main, 仓库里只包含有用的内容 接着, 另一人使用基于 Web 技术的 IDE 提交了另一个合并请求, 一看发现有一个完全无关的目录也被提交了, 于是 .gitignore 里又增加了一条内容 target __pycache__ bin .DS_Store .vscode 接下来, 有人使用 IntelliJ IDEA 提交了五百个 XML 文件和 .idea 目录, 这时又不得不将其加入 .gitignore target __pycache__ bin .DS_Store .vscode .idea 多年后, .gitignore 已经有了上百行, 但是仍然时不时有各种奇怪的文件, 例如 testscripts、foo、a、qux、data.tar.gz、start.sh、cat …… ...

August 8, 2025 · 1 min · 127 words · Starslayerx

FastAPI Parameters and Validations

这篇文章介绍 FastAPI 中的参数验证功能 Query Parameters and String Validations FastAPI 允许为参数声明额外的信息和验证规则 from fastapi import FastAPI app = FastAPI() @app.get("/items/") async def read_items(q: str | None = None): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: results.update({"q": q}) return results q 是类型为 str | None 的查询参数, 这意味着它可以是字符串, 也可以是 None. 其默认值是 None, 因此 FastAPI 会识别它为“可选参数” FastAPI 通过 = None 的默认值知道该参数是非必填的 使用 str | None 还能帮助编辑器提供更好的类型提示和错误检测 Additional validation 额外验证 即使 q 是可选的, 但仍然可以设置条件: 如果提供了 q, 则长度不能超过50个字符 使用 Query 和 Annotated 来实现 from typing import Annotated from fastapi import FastAPI, Query app = FastAPI() @app.get("/items/") async def read_items(q: Annotated[str | None, Query(max_length=50)] = None): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: results.update({"q": q}) return results 使用 Annotated 包装后, 就可以传递额外的元数据(Query(max_length=5)), 用于校验或者文档 ...

August 7, 2025 · 4 min · 779 words · Starslayerx

FastAPI Parameters

FastAPI 是一个现代、快速(高性能)的 Python Web 框架, 它自动处理参数的解析、验证和文档生成 本文将介绍 FastAPI 中三类最常用的参数: 路径参数 (Path Parameters)、查询参数 (Query Parameters) 和 请求体(Request Body) 的用法与原理 1. Path Parameters 路径参数 路径参数是 URL 路径中的动态部分, 使用 {} 包裹表示 from fastapi import FastAPI app = FastAPI() @app.get("/items/{item_id}") async def read_item(item_id: str): return {"item_id": item_id} 访问 /items/foo 返回: {"item_id": "foo"} Data conversion & validation 类型声明与自动转换 可以为路径参数声明类型, FastAPI 会自动解析并验证: @app.get("/items/{item_id}") async def read_item(item_id: int): return {"item_id": item_id} 访问 /items/3, item_id 会被转换为 int 类型 Routing orders 路由匹配顺序 路径匹配按声明顺序执行, 例如 @app.get("/users/me") async def read_user_me(): return {"user_id": "current_user"} @app.get("/users/{user_id}") async def read_user(user_id: str): return {"user_id": user_id} 必须先声明 /users/me, 否则会被 /users/{user_id} 捕获 ...

August 6, 2025 · 3 min · 525 words · Starslayerx

Python Tricks

1. The Self-Replicating Trick 将一个含有空列表的列表乘5, 得到有5个空列表的列表 x = [[]] * 5 x [[], [], [], [], []] 当使用.append("x")方法时, 所有列表都被修改 x[0].append("x") x [[“x”], [“x”], [“x”], [“x”], [“x”]] 打印其 id 可以看到, id 都相同 for item in x: print(id(item)) 4417579584 4417579584 4417579584 4417579584 4417579584 或者使用set()发现 id 唯一 set(id(item) for item in x) {4417579584} 也就是说, 当使用乘法的时候, 创建了5个内部列表的引用副本 使用反汇编发现, 只创建了两个列表, 并执行乘5 dis.dis("[[]] * 5") 0 0 RESUME 0 # 用于支持解释器恢复 (py3.11) 1 2 BUILD_LIST 0 # 构造一个空列表[], 压栈 4 BUILD_LIST 1 # 从栈顶取一个对象, 构造列表[[]] 6 LOAD_CONST 0 (5) # 加载常量 5 8 BINARY_OP 5 (*) # 对栈顶两个元素执行乘法 12 RETURN_VALUE # 返回栈顶结果 The alternative 如果要构造独立列表, 应改用列表推导式 ...

August 5, 2025 · 3 min · 432 words · Starslayerx

Executing arbitrary Python code from a comment

通过注释执行任意Python代码 问题描述 Q: 只能控制一行的.py代码中注释的内容(\n\r均会被替换为空字符), 如何执行任意代码? A: 在注释#中, 构造一个.zip 文件, python 会将该内容当成一个 zip 包执行, 触发任意代码执行 解决方案 从 Python 3.5 起, 可以直接执行一个 .zip 文件 python myapp.zip 前提是ZIP 包中包含一个顶层的__main__.py文件, Python 会把它当作 zipapp, 自动解压并运行__main__.py Python 会从末尾找到 ZIP 的目录结构, 而不是依赖文件头, 所以前面的“垃圾”字节会被忽略 Python 源码中的任何行, 只要以 # 开头, 解释器都会忽略后面内容, 因此可以: 把 ZIP 文件的数据藏在 Python 源码中的注释中(开头加 #) 把 ZIP 数据直接拼接在 Python 文件的后面, 只保证文件头部分是合法 Python ZIP 不关心前缀, Python 只要最前面是有效源码, 也不会管后面 难点 ZIP 文件头包含二进制字段,比如 偏移量(文件数据相对于 ZIP 开头的位置) 长度(文件名长度、注释长度等) 这些值写死在 header 里, 是十六进制整数 如果这些字节中出现了像 \x00、\xFF 等非 ASCII 内容, Python 就不能把它当注释 解决方法: 暴力穷举合法组合 ...

August 4, 2025 · 3 min · 563 words · Starslayerx

How FastAPI Works

FastAPI 的工作原理: 从 routing 到 lifecycle 以及在现实中的使用 FastAPI FastAPI 是一个现代的 Python Web 框架, 注重高性能和开发效率. 旨在帮助开发者编写结构清晰、可靠的API, 同时尽量减少样板代码 (boilerplate) 其由以下两个库驱动: Starlette: 负责 Web 服务器逻辑、路由、中间件和异步能力 Pydantic: 基于 Python 类型提示, 处理数据验证、解析和序列化 此外, Fastapi 还有输入验证、基于 Swagger UI 的自动文档生成和代码清晰化的基础 API 请求周期 Fastapi 的请求生命周期如下 客户端请求 (Client Request) ↓ FastAPI App ↓ 中间件(Middleware) ↓ 路由匹配 (Route Matching) ↓ 依赖注入(Dependency Injection) ↓ 输入验证 (Input Validation) ↓ 端点函数 (Endpoint) ↓ 响应序列化 (Response Serialization) ↓ 客户端响应 (Client Response) 请求首先进入 FastAPI 应用 (本质就是一个 Starlette 应用) 所有中间件优先执行 (如: 日志、错误处理、CORS等) 路由器检查路径和方法, 找到对应的处理函数 FastAPI 使用Depends解析依赖 使用 Pydantic 自动解析并验证输入数据 执行端点函数, 参数验证完毕 返回结果被序列化为合适的响应格式 (JSON) 响应返回给客户端 路由 Router 在应用对象上定义 适合小项目或原型验证 ...

August 3, 2025 · 2 min · 322 words · Starslayerx

"Chaos Enginnering" In Partice

记录一个小故事 “混沌工程”实践 项目延期,开发说时间不够干不完 老板:“不够就招人” 今天偶然听到旁边同事给新来的员工做code review: Q:你这个代码不要这样写,因为…… A:哦,懂了 Q:唉?你这个 .idea/ 文件是什么? A:啊?我也不知道 我:不是???(一脸震惊) 理想:Plan Do Check Act 现实:Plan Delay Cancel Apologize

August 2, 2025 · 1 min · 21 words · Starslayerx