为爱觉醒工具库
Project description
AI4Love 通用工具库
面向多项目复用的 Python 通用工具库,当前提供租户隔离模块,后续持续扩展更多模块。
模块概览
tenant:租户隔离与上下文管理
租户模块功能特性
- 租户ID和用户ID提取:从 HTTP 请求头中自动提取租户ID和用户ID
- 上下文存储:使用
contextvars实现线程安全的上下文变量存储 - 装饰器支持:提供
@extract_tenant_id和@with_tenant_context装饰器 - SQL 自动封装:自动为 SQL 语句附加租户条件
- SQLAlchemy 集成:在不改动业务代码的前提下,自动为 ORM 查询追加租户过滤
安装
pip install -e .
快速开始
1. 使用装饰器自动提取租户ID(推荐)
from fastapi import FastAPI, Request
from ai4love_tools.tenant.decorators import extract_tenant_id
from ai4love_tools.tenant.context import get_tenant_id, get_user_id
app = FastAPI()
@app.get("/users")
@extract_tenant_id # 自动从请求头提取租户ID和用户ID
async def get_users(request: Request):
tenant_id = get_tenant_id() # 从上下文获取租户ID
user_id = get_user_id() # 从上下文获取用户ID
return {"tenant_id": tenant_id, "user_id": user_id}
2. 手动提取和设置
from ai4love_tools.tenant.extractor import extract_tenant_id_from_request, extract_user_id_from_request
from ai4love_tools.tenant.context import set_tenant_id, set_user_id
def manual_extract(request):
tenant_id = extract_tenant_id_from_request(request)
user_id = extract_user_id_from_request(request)
set_tenant_id(tenant_id)
set_user_id(user_id)
3. 多线程/后台任务上下文传递
from ai4love_tools.tenant.decorators import with_tenant_context
from ai4love_tools.tenant.context import get_tenant_id, get_user_id
from concurrent.futures import ThreadPoolExecutor
@with_tenant_context
def background_task(data):
# 在新线程中,租户上下文已自动传递
tenant_id = get_tenant_id()
user_id = get_user_id()
process_data(data)
executor = ThreadPoolExecutor()
executor.submit(background_task, data)
4. SQL 封装使用
from ai4love_tools.tenant.sql import tenant_execute
from ai4love_tools.tenant.context import set_tenant_id
# 设置租户ID到上下文
set_tenant_id("tenant_123")
def list_users(conn):
# 业务侧只关心业务条件
base_sql = "SELECT id, name FROM users WHERE status = :status"
params = {"status": "active"}
# 底层自动从上下文获取租户ID,并追加 tenant 条件
def executor(sql: str, params: dict):
with conn.cursor() as cursor:
cursor.execute(sql, params)
return cursor.fetchall()
rows = tenant_execute(executor, base_sql, params)
return rows
5. SQLAlchemy ORM 自动租户过滤
from sqlalchemy import create_engine
from ai4love_tools.tenant.sqlalchemy_integration import enable_sqlalchemy_tenant_isolation
# 在应用启动时启用
engine = create_engine("sqlite:///db.sqlite")
enable_sqlalchemy_tenant_isolation(engine)
# 业务代码无需改动,自动追加租户过滤
from sqlalchemy.orm import Session
from your_models import User
with Session(engine) as session:
# 自动追加 tenant_id 条件
users = session.query(User).filter(User.status == "active").all()
API 文档
上下文管理
get_tenant_id(): 获取当前上下文中的租户IDget_user_id(): 获取当前上下文中的用户IDset_tenant_id(tenant_id): 设置租户ID到上下文set_user_id(user_id): 设置用户ID到上下文
装饰器
@extract_tenant_id: 自动从请求头提取租户ID和用户ID并保存到上下文@with_tenant_context: 自动复制租户上下文到新线程/任务
SQL 封装
tenant_execute(executor, sql, params, ...): 执行包含租户条件的 SQL 语句build_tenant_sql(sql, ...): 构建包含租户条件的 SQL 语句build_tenant_params(params, tenant_id, ...): 构建包含租户ID的参数
SQLAlchemy 集成
enable_sqlalchemy_tenant_isolation(engine_or_session_factory, ...): 启用 SQLAlchemy ORM 自动租户过滤
依赖要求
- Python >= 3.12
- fastapi >= 0.115.0
- sqlalchemy >= 1.4.0
注意事项
- contextvars 无法跨进程传递,进程池场景需要显式传递租户ID作为参数
- 装饰器是给其他项目使用的,library 只负责提供装饰器函数,不负责具体的任务调度逻辑
- library 本身不包含业务逻辑,只提供工具函数和装饰器
- 尽量保持框架无关性,支持多种 Web 框架
运行测试
# 安装开发依赖
pip install -e ".[dev]"
# 运行所有测试
pytest
# 运行特定测试文件
pytest tests/test_context.py
# 运行测试并显示覆盖率
pytest --cov=src/ai4love_tools --cov-report=html
测试覆盖
测试覆盖以下模块:
test_context.py- 上下文存储管理测试test_extractor.py- 租户ID和用户ID提取器测试test_decorators.py- 装饰器功能测试test_sql.py- SQL 封装函数测试test_sqlalchemy_integration.py- SQLAlchemy 集成测试test_integration.py- 集成测试(多模块协同工作)
许可证
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
ai4love_tools-0.0.8.tar.gz
(17.5 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ai4love_tools-0.0.8.tar.gz.
File metadata
- Download URL: ai4love_tools-0.0.8.tar.gz
- Upload date:
- Size: 17.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6013bae42395281f4b54c8cc8c448b9f6f0d60b703df5b2d7cc97eab77d106d2
|
|
| MD5 |
dc31b3b92e93ab7754d52b606310e67c
|
|
| BLAKE2b-256 |
7e6e6e9af141bc9030a2e306dc8a82c989e8772e580fb1e8cb19cff70d6ef373
|
File details
Details for the file ai4love_tools-0.0.8-py3-none-any.whl.
File metadata
- Download URL: ai4love_tools-0.0.8-py3-none-any.whl
- Upload date:
- Size: 14.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e43530d30a8943a96513e583ede8b0fde479f1abd129b2c68b38fe3ff775f1ac
|
|
| MD5 |
f4e71fa88ffc8beb02d6e51f461337bc
|
|
| BLAKE2b-256 |
e3f0811d252122f47a37dad1ddc78a588e9850a9acfe3e15ed4871f0aba916d9
|