jalontsui-fastapi-kit 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. jalontsui_fastapi_kit-0.1.0/LICENSE +21 -0
  2. jalontsui_fastapi_kit-0.1.0/PKG-INFO +136 -0
  3. jalontsui_fastapi_kit-0.1.0/README.md +97 -0
  4. jalontsui_fastapi_kit-0.1.0/pyproject.toml +66 -0
  5. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/__init__.py +152 -0
  6. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/cache/README.md +195 -0
  7. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/cache/__init__.py +14 -0
  8. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/cache/redis.py +40 -0
  9. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/config/README.md +176 -0
  10. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/config/__init__.py +50 -0
  11. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/config/app.py +46 -0
  12. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/config/base.py +41 -0
  13. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/config/common.py +32 -0
  14. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/config/db.py +92 -0
  15. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/config/log.py +70 -0
  16. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/config/redis.py +114 -0
  17. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/config/security.py +30 -0
  18. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/config/storage.py +71 -0
  19. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/db/README.md +313 -0
  20. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/db/__init__.py +41 -0
  21. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/db/base.py +166 -0
  22. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/db/handlers.py +46 -0
  23. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/db/session.py +99 -0
  24. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/db/transaction.py +38 -0
  25. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/dependencies/__init__.py +32 -0
  26. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/dependencies/rate_limit.py +201 -0
  27. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/errors/README.md +334 -0
  28. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/errors/__init__.py +61 -0
  29. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/errors/codes.py +93 -0
  30. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/errors/exceptions.py +102 -0
  31. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/errors/handlers/__init__.py +28 -0
  32. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/errors/handlers/base.py +47 -0
  33. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/errors/handlers/builtin.py +126 -0
  34. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/errors/handlers/registry.py +105 -0
  35. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/errors/handlers/utils.py +30 -0
  36. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/errors/messages.py +172 -0
  37. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/health/README.md +178 -0
  38. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/health/__init__.py +97 -0
  39. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/logging/README.md +220 -0
  40. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/logging/__init__.py +61 -0
  41. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/logging/config.py +341 -0
  42. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/logging/context.py +44 -0
  43. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/logging/filters.py +40 -0
  44. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/logging/formatters.py +119 -0
  45. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/logging/handlers.py +170 -0
  46. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/logging/settings.py +44 -0
  47. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/logging/utils.py +212 -0
  48. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/middleware/README.md +191 -0
  49. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/middleware/__init__.py +25 -0
  50. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/middleware/cors.py +45 -0
  51. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/middleware/locale.py +122 -0
  52. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/middleware/request_id.py +116 -0
  53. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/py.typed +0 -0
  54. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/repositories/README.md +170 -0
  55. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/repositories/__init__.py +11 -0
  56. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/repositories/base.py +162 -0
  57. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/repositories/utils.py +80 -0
  58. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/response.py +47 -0
  59. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/schemas/README.md +166 -0
  60. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/schemas/common.py +64 -0
  61. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/search/README.md +176 -0
  62. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/search/__init__.py +15 -0
  63. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/search/elasticsearch.py +50 -0
  64. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/security/README.md +244 -0
  65. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/security/__init__.py +33 -0
  66. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/security/captcha.py +113 -0
  67. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/security/jwt.py +92 -0
  68. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/security/password.py +94 -0
  69. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/services/README.md +113 -0
  70. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/services/__init__.py +5 -0
  71. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/services/base.py +68 -0
  72. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/storage/__init__.py +49 -0
  73. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/storage/base.py +75 -0
  74. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/storage/factory.py +96 -0
  75. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/storage/local.py +88 -0
  76. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/storage/s3.py +184 -0
  77. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/utils/__init__.py +6 -0
  78. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/utils/time.py +66 -0
  79. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/validation/README.md +164 -0
  80. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/validation/__init__.py +15 -0
  81. jalontsui_fastapi_kit-0.1.0/src/jalontsui_fastapi_kit/validation/errors.py +207 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 JalonTsui (jalontsui@163.com)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,136 @@
1
+ Metadata-Version: 2.4
2
+ Name: jalontsui-fastapi-kit
3
+ Version: 0.1.0
4
+ Summary: JalonTsui Fastapi Kit:FastAPI 服务公共基础设施包(配置、数据库、缓存、日志、错误体系、安全、中间件等)
5
+ Keywords: fastapi,toolkit,infrastructure,backend,jwt,sqlalchemy,redis
6
+ Author: JalonTsui
7
+ Author-email: JalonTsui <jalontsui@163.com>
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Framework :: FastAPI
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
18
+ Classifier: Typing :: Typed
19
+ Requires-Dist: fastapi>=0.115.0
20
+ Requires-Dist: pydantic>=2.10.0
21
+ Requires-Dist: pydantic-settings>=2.7.0
22
+ Requires-Dist: sqlalchemy[asyncio]>=2.0.40
23
+ Requires-Dist: passlib[bcrypt]>=1.7.4
24
+ Requires-Dist: bcrypt>=4.0.0,<4.1.0
25
+ Requires-Dist: pyjwt[crypto]>=2.10.0
26
+ Requires-Dist: redis>=5.0.0,<6.0
27
+ Requires-Dist: tzlocal>=5.0
28
+ Requires-Dist: pillow>=10.0.0 ; extra == 'captcha'
29
+ Requires-Dist: asyncmy>=0.2.10 ; extra == 'mysql'
30
+ Requires-Dist: pymysql>=1.1.1 ; extra == 'mysql'
31
+ Requires-Dist: aioboto3>=15.5.0 ; extra == 'storage'
32
+ Requires-Python: >=3.11
33
+ Project-URL: Homepage, https://gitee.com/jalontsui/jalontsui-py-magic/tree/main/packages/jalontsui-fastapi-kit
34
+ Project-URL: Repository, https://gitee.com/jalontsui/jalontsui-py-magic
35
+ Provides-Extra: captcha
36
+ Provides-Extra: mysql
37
+ Provides-Extra: storage
38
+ Description-Content-Type: text/markdown
39
+
40
+ # JalonTsui Fastapi Kit
41
+
42
+ 面向 FastAPI 服务的公共基础设施包:配置、数据库、缓存、日志、错误体系、安全、中间件等通用能力一次装齐,业务包只做业务语义薄封装。
43
+
44
+ | 项 | 值 |
45
+ |----|----|
46
+ | 发行名(安装名) | `jalontsui-fastapi-kit` |
47
+ | import 名 | `jalontsui_fastapi_kit` |
48
+ | Python 要求 | `>=3.11` |
49
+ | 许可证 | MIT |
50
+
51
+ ## 安装
52
+
53
+ ```bash
54
+ uv add jalontsui-fastapi-kit
55
+ ```
56
+
57
+ 按实际需要选装 extras(可组合,如 `[mysql,storage]`):
58
+
59
+ ```bash
60
+ uv add "jalontsui-fastapi-kit[mysql]" # MySQL 驱动:asyncmy(异步)+ pymysql(同步 / Alembic 迁移)
61
+ uv add "jalontsui-fastapi-kit[captcha]" # 图形验证码:Pillow
62
+ uv add "jalontsui-fastapi-kit[storage]" # S3 协议对象存储:aioboto3
63
+ ```
64
+
65
+ 核心依赖只包含 FastAPI / Pydantic / SQLAlchemy / Redis 等基础库;数据库驱动与 Pillow 均为可选,纯工具脚本不会被强迫安装 MySQL 驱动。驱动缺失时,创建数据库引擎会抛出带安装提示的中文报错。
66
+
67
+ 发布前也可从 Git 直装(monorepo subdirectory 方式):
68
+
69
+ ```bash
70
+ uv add "git+https://gitee.com/jalontsui/jalontsui-py-magic.git@jalontsui-fastapi-kit-v0.1.0#subdirectory=packages/jalontsui-fastapi-kit"
71
+ ```
72
+
73
+ ## 快速上手
74
+
75
+ ```python
76
+ from jalontsui_fastapi_kit.config import BaseAppSettings
77
+ from jalontsui_fastapi_kit.response import ApiResponse
78
+
79
+
80
+ class Settings(BaseAppSettings):
81
+ """业务配置继承基类,即获得全部通用配置字段."""
82
+
83
+ app_name: str = "my-service"
84
+ db_name: str = "my_db"
85
+
86
+
87
+ settings = Settings()
88
+
89
+ # 统一响应结构
90
+ content = ApiResponse.ok(data={"id": 1})
91
+ ```
92
+
93
+ 创建数据库引擎(`mysql+asyncmy` 等驱动需先安装 `[mysql]` extra):
94
+
95
+ ```python
96
+ from jalontsui_fastapi_kit.db import create_async_engine_from_url
97
+
98
+ engine = create_async_engine_from_url(settings.build_db_async_url())
99
+ ```
100
+
101
+ ## 能力清单
102
+
103
+ | 能力 | 导入路径 | 使用文档 |
104
+ |------|----------|----------|
105
+ | 统一响应结构 | `jalontsui_fastapi_kit.response.ApiResponse` | — |
106
+ | 业务异常体系与错误码 | `jalontsui_fastapi_kit.errors` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/errors/README.md) |
107
+ | 全局异常处理器 | `jalontsui_fastapi_kit.errors.handlers` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/errors/README.md) |
108
+ | 应用配置基类与配置分块 | `jalontsui_fastapi_kit.config.BaseAppSettings` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/config/README.md) |
109
+ | 数据库基类与异步引擎工厂 | `jalontsui_fastapi_kit.db` / `create_async_engine_from_url` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/db/README.md) |
110
+ | 可嵌套事务上下文 | `jalontsui_fastapi_kit.db.transaction` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/db/README.md) |
111
+ | 通用 Repository | `jalontsui_fastapi_kit.repositories.base.BaseRepository` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/repositories/README.md) |
112
+ | Service 基类 | `jalontsui_fastapi_kit.services.base.BaseService` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/services/README.md) |
113
+ | Redis 客户端 | `jalontsui_fastapi_kit.cache` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/cache/README.md) |
114
+ | 健康检查框架 | `jalontsui_fastapi_kit.health` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/health/README.md) |
115
+ | 请求追踪 / CORS / 语言中间件 | `jalontsui_fastapi_kit.middleware` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/middleware/README.md) |
116
+ | 结构化日志 | `jalontsui_fastapi_kit.logging` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/logging/README.md) |
117
+ | 密码哈希 / JWT / 图形验证码 | `jalontsui_fastapi_kit.security` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/security/README.md) |
118
+ | 分页 Schema | `jalontsui_fastapi_kit.schemas.common` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/schemas/README.md) |
119
+ | 参数校验格式化 | `jalontsui_fastapi_kit.validation` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/validation/README.md) |
120
+ | 搜索引擎扩展位 | `jalontsui_fastapi_kit.search` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/search/README.md) |
121
+
122
+ ## 设计原则
123
+
124
+ - **零业务依赖**:本包只允许依赖通用第三方库,禁止依赖任何业务包。
125
+ - **业务包优先复用**:新增通用能力先在本包实现,业务侧做薄层封装或直接导入。
126
+ - **业务专属留在业务包**:业务错误码、业务 Service / Repository、业务配置不进入本包。
127
+
128
+ ## 边界
129
+
130
+ - 不包含 MinIO / Qdrant / Celery 等业务中间件。
131
+ - 数据库驱动(asyncmy / pymysql)与 Pillow 为可选依赖,见上文 extras。
132
+
133
+ ## 版本与协议
134
+
135
+ - 版本记录:[CHANGELOG.md](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/CHANGELOG.md)。
136
+ - 许可证:[MIT](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/LICENSE)。
@@ -0,0 +1,97 @@
1
+ # JalonTsui Fastapi Kit
2
+
3
+ 面向 FastAPI 服务的公共基础设施包:配置、数据库、缓存、日志、错误体系、安全、中间件等通用能力一次装齐,业务包只做业务语义薄封装。
4
+
5
+ | 项 | 值 |
6
+ |----|----|
7
+ | 发行名(安装名) | `jalontsui-fastapi-kit` |
8
+ | import 名 | `jalontsui_fastapi_kit` |
9
+ | Python 要求 | `>=3.11` |
10
+ | 许可证 | MIT |
11
+
12
+ ## 安装
13
+
14
+ ```bash
15
+ uv add jalontsui-fastapi-kit
16
+ ```
17
+
18
+ 按实际需要选装 extras(可组合,如 `[mysql,storage]`):
19
+
20
+ ```bash
21
+ uv add "jalontsui-fastapi-kit[mysql]" # MySQL 驱动:asyncmy(异步)+ pymysql(同步 / Alembic 迁移)
22
+ uv add "jalontsui-fastapi-kit[captcha]" # 图形验证码:Pillow
23
+ uv add "jalontsui-fastapi-kit[storage]" # S3 协议对象存储:aioboto3
24
+ ```
25
+
26
+ 核心依赖只包含 FastAPI / Pydantic / SQLAlchemy / Redis 等基础库;数据库驱动与 Pillow 均为可选,纯工具脚本不会被强迫安装 MySQL 驱动。驱动缺失时,创建数据库引擎会抛出带安装提示的中文报错。
27
+
28
+ 发布前也可从 Git 直装(monorepo subdirectory 方式):
29
+
30
+ ```bash
31
+ uv add "git+https://gitee.com/jalontsui/jalontsui-py-magic.git@jalontsui-fastapi-kit-v0.1.0#subdirectory=packages/jalontsui-fastapi-kit"
32
+ ```
33
+
34
+ ## 快速上手
35
+
36
+ ```python
37
+ from jalontsui_fastapi_kit.config import BaseAppSettings
38
+ from jalontsui_fastapi_kit.response import ApiResponse
39
+
40
+
41
+ class Settings(BaseAppSettings):
42
+ """业务配置继承基类,即获得全部通用配置字段."""
43
+
44
+ app_name: str = "my-service"
45
+ db_name: str = "my_db"
46
+
47
+
48
+ settings = Settings()
49
+
50
+ # 统一响应结构
51
+ content = ApiResponse.ok(data={"id": 1})
52
+ ```
53
+
54
+ 创建数据库引擎(`mysql+asyncmy` 等驱动需先安装 `[mysql]` extra):
55
+
56
+ ```python
57
+ from jalontsui_fastapi_kit.db import create_async_engine_from_url
58
+
59
+ engine = create_async_engine_from_url(settings.build_db_async_url())
60
+ ```
61
+
62
+ ## 能力清单
63
+
64
+ | 能力 | 导入路径 | 使用文档 |
65
+ |------|----------|----------|
66
+ | 统一响应结构 | `jalontsui_fastapi_kit.response.ApiResponse` | — |
67
+ | 业务异常体系与错误码 | `jalontsui_fastapi_kit.errors` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/errors/README.md) |
68
+ | 全局异常处理器 | `jalontsui_fastapi_kit.errors.handlers` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/errors/README.md) |
69
+ | 应用配置基类与配置分块 | `jalontsui_fastapi_kit.config.BaseAppSettings` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/config/README.md) |
70
+ | 数据库基类与异步引擎工厂 | `jalontsui_fastapi_kit.db` / `create_async_engine_from_url` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/db/README.md) |
71
+ | 可嵌套事务上下文 | `jalontsui_fastapi_kit.db.transaction` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/db/README.md) |
72
+ | 通用 Repository | `jalontsui_fastapi_kit.repositories.base.BaseRepository` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/repositories/README.md) |
73
+ | Service 基类 | `jalontsui_fastapi_kit.services.base.BaseService` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/services/README.md) |
74
+ | Redis 客户端 | `jalontsui_fastapi_kit.cache` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/cache/README.md) |
75
+ | 健康检查框架 | `jalontsui_fastapi_kit.health` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/health/README.md) |
76
+ | 请求追踪 / CORS / 语言中间件 | `jalontsui_fastapi_kit.middleware` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/middleware/README.md) |
77
+ | 结构化日志 | `jalontsui_fastapi_kit.logging` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/logging/README.md) |
78
+ | 密码哈希 / JWT / 图形验证码 | `jalontsui_fastapi_kit.security` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/security/README.md) |
79
+ | 分页 Schema | `jalontsui_fastapi_kit.schemas.common` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/schemas/README.md) |
80
+ | 参数校验格式化 | `jalontsui_fastapi_kit.validation` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/validation/README.md) |
81
+ | 搜索引擎扩展位 | `jalontsui_fastapi_kit.search` | [使用指南](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/search/README.md) |
82
+
83
+ ## 设计原则
84
+
85
+ - **零业务依赖**:本包只允许依赖通用第三方库,禁止依赖任何业务包。
86
+ - **业务包优先复用**:新增通用能力先在本包实现,业务侧做薄层封装或直接导入。
87
+ - **业务专属留在业务包**:业务错误码、业务 Service / Repository、业务配置不进入本包。
88
+
89
+ ## 边界
90
+
91
+ - 不包含 MinIO / Qdrant / Celery 等业务中间件。
92
+ - 数据库驱动(asyncmy / pymysql)与 Pillow 为可选依赖,见上文 extras。
93
+
94
+ ## 版本与协议
95
+
96
+ - 版本记录:[CHANGELOG.md](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/CHANGELOG.md)。
97
+ - 许可证:[MIT](https://gitee.com/jalontsui/jalontsui-py-magic/blob/main/packages/jalontsui-fastapi-kit/LICENSE)。
@@ -0,0 +1,66 @@
1
+ [project]
2
+ name = "jalontsui-fastapi-kit"
3
+ version = "0.1.0"
4
+ description = "JalonTsui Fastapi Kit:FastAPI 服务公共基础设施包(配置、数据库、缓存、日志、错误体系、安全、中间件等)"
5
+ readme = "README.md"
6
+ authors = [
7
+ { name = "JalonTsui", email = "jalontsui@163.com" }
8
+ ]
9
+ license = "MIT"
10
+ license-files = ["LICENSE"]
11
+ requires-python = ">=3.11"
12
+ classifiers = [
13
+ "Development Status :: 4 - Beta",
14
+ "Intended Audience :: Developers",
15
+ "Framework :: FastAPI",
16
+ "Programming Language :: Python :: 3",
17
+ "Programming Language :: Python :: 3.11",
18
+ "Programming Language :: Python :: 3.12",
19
+ "Programming Language :: Python :: 3.13",
20
+ "Topic :: Software Development :: Libraries :: Python Modules",
21
+ "Typing :: Typed",
22
+ ]
23
+ keywords = ["fastapi", "toolkit", "infrastructure", "backend", "jwt", "sqlalchemy", "redis"]
24
+ dependencies = [
25
+ "fastapi>=0.115.0", # Web 框架依赖,用于中间件、依赖注入与响应类型
26
+ "pydantic>=2.10.0", # 数据校验与序列化
27
+ "pydantic-settings>=2.7.0", # 基于 Pydantic 的配置管理(支持 .env)
28
+ "sqlalchemy[asyncio]>=2.0.40", # ORM 与异步数据库连接抽象
29
+ "passlib[bcrypt]>=1.7.4", # 密码哈希
30
+ "bcrypt>=4.0.0,<4.1.0", # 与 passlib 1.7.4 兼容的 bcrypt 版本
31
+ "pyjwt[crypto]>=2.10.0", # JWT 加解密(替代停更的 python-jose,见 TODO 第 45 条)
32
+ "redis>=5.0.0,<6.0", # Redis 客户端,用于健康检查与缓存场景
33
+ "tzlocal>=5.0", # 获取服务器本地时区(IANA),用于默认时区展示
34
+ ]
35
+
36
+ [project.optional-dependencies]
37
+ # 数据库驱动由消费方按实际数据库选装:uv add "jalontsui-fastapi-kit[mysql]"
38
+ mysql = [
39
+ "asyncmy>=0.2.10", # MySQL 异步驱动
40
+ "pymysql>=1.1.1", # MySQL 同步驱动(Alembic 等场景使用)
41
+ ]
42
+ # 图形验证码依赖 Pillow:uv add "jalontsui-fastapi-kit[captcha]"
43
+ captcha = [
44
+ "pillow>=10.0.0",
45
+ ]
46
+ storage = [
47
+ "aioboto3>=15.5.0",
48
+ ]
49
+
50
+ [project.urls]
51
+ Homepage = "https://gitee.com/jalontsui/jalontsui-py-magic/tree/main/packages/jalontsui-fastapi-kit"
52
+ Repository = "https://gitee.com/jalontsui/jalontsui-py-magic"
53
+
54
+ [build-system]
55
+ requires = ["uv_build>=0.11.15,<0.12.0"]
56
+ build-backend = "uv_build"
57
+
58
+ # 显式声明 uv_build 的模块名与模块根目录,避免改名或自动推导时踩坑
59
+ [tool.uv.build-backend]
60
+ module-name = "jalontsui_fastapi_kit"
61
+ module-root = "src"
62
+
63
+ [tool.pytest.ini_options]
64
+ asyncio_mode = "auto"
65
+ asyncio_default_fixture_loop_scope = "session"
66
+ asyncio_default_test_loop_scope = "session"
@@ -0,0 +1,152 @@
1
+ """jalontsui-common —— 项目公共基础设施包."""
2
+
3
+ from jalontsui_fastapi_kit.cache import RedisClient, create_redis_client
4
+ from jalontsui_fastapi_kit.config import BaseAppSettings
5
+ from jalontsui_fastapi_kit.db import (
6
+ Base,
7
+ close_async_engine,
8
+ create_async_engine_from_url,
9
+ create_async_session_factory,
10
+ transaction,
11
+ )
12
+ from jalontsui_fastapi_kit.errors import (
13
+ BadRequestException,
14
+ BusinessException,
15
+ DatabaseConflictException,
16
+ DatabaseIntegrityException,
17
+ ErrorMessageRegistry,
18
+ ExceptionHandler,
19
+ ExceptionHandlerRegistry,
20
+ ExternalServiceException,
21
+ ForbiddenException,
22
+ NotFoundException,
23
+ UnauthorizedException,
24
+ ValidationException,
25
+ get_message,
26
+ set_default_locale,
27
+ set_request_locale,
28
+ )
29
+ from jalontsui_fastapi_kit.health import (
30
+ HealthChecker,
31
+ HealthCheckResponse,
32
+ HealthResult,
33
+ check_database,
34
+ check_redis,
35
+ )
36
+ from jalontsui_fastapi_kit.logging import (
37
+ DEFAULT_LOG_FORMAT,
38
+ RequestIdFilter,
39
+ get_request_id,
40
+ parse_level,
41
+ request_id_ctx,
42
+ setup_logging,
43
+ )
44
+ from jalontsui_fastapi_kit.middleware import (
45
+ REQUEST_ID_HEADER,
46
+ LocaleMiddleware,
47
+ RequestIdMiddleware,
48
+ setup_cors,
49
+ )
50
+ from jalontsui_fastapi_kit.repositories.base import BaseRepository
51
+ from jalontsui_fastapi_kit.response import ApiResponse
52
+ from jalontsui_fastapi_kit.schemas.common import (
53
+ ListResponse,
54
+ PageResponse,
55
+ ScrollPageResponse,
56
+ )
57
+ from jalontsui_fastapi_kit.search import (
58
+ ElasticsearchClient,
59
+ create_elasticsearch_client,
60
+ )
61
+ from jalontsui_fastapi_kit.services import BaseService
62
+ from jalontsui_fastapi_kit.utils.time import utc_naive_to_local, utc_naive_to_local_str
63
+ from jalontsui_fastapi_kit.security import (
64
+ captcha_image_to_base64,
65
+ generate_captcha_code,
66
+ generate_captcha_image,
67
+ hash_password,
68
+ password_needs_rehash,
69
+ verify_password,
70
+ )
71
+ from jalontsui_fastapi_kit.validation import (
72
+ ValidationErrorItem,
73
+ format_validation_errors,
74
+ validation_errors_to_dict,
75
+ )
76
+
77
+ __all__ = [
78
+ # cache
79
+ "RedisClient",
80
+ "create_redis_client",
81
+ # config
82
+ "BaseAppSettings",
83
+ # db
84
+ "Base",
85
+ "create_async_engine_from_url",
86
+ "create_async_session_factory",
87
+ "close_async_engine",
88
+ # errors
89
+ "ErrorMessageRegistry",
90
+ "get_message",
91
+ "set_default_locale",
92
+ "set_request_locale",
93
+ "BusinessException",
94
+ "NotFoundException",
95
+ "ValidationException",
96
+ "BadRequestException",
97
+ "UnauthorizedException",
98
+ "ForbiddenException",
99
+ "DatabaseConflictException",
100
+ "DatabaseIntegrityException",
101
+ "ExternalServiceException",
102
+ # handlers
103
+ "ExceptionHandler",
104
+ "ExceptionHandlerRegistry",
105
+ # health
106
+ "HealthChecker",
107
+ "HealthCheckResponse",
108
+ "HealthResult",
109
+ "check_database",
110
+ "check_redis",
111
+ # logging
112
+ "DEFAULT_LOG_FORMAT",
113
+ "RequestIdFilter",
114
+ "get_request_id",
115
+ "parse_level",
116
+ "request_id_ctx",
117
+ "setup_logging",
118
+ # middleware
119
+ "REQUEST_ID_HEADER",
120
+ "RequestIdMiddleware",
121
+ "LocaleMiddleware",
122
+ "setup_cors",
123
+ # repositories
124
+ "BaseRepository",
125
+ # response
126
+ "ApiResponse",
127
+ # services
128
+ "BaseService",
129
+ # transaction
130
+ "transaction",
131
+ # schemas
132
+ "ListResponse",
133
+ "PageResponse",
134
+ "ScrollPageResponse",
135
+ # search
136
+ "ElasticsearchClient",
137
+ "create_elasticsearch_client",
138
+ # security
139
+ "hash_password",
140
+ "verify_password",
141
+ "password_needs_rehash",
142
+ "generate_captcha_code",
143
+ "generate_captcha_image",
144
+ "captcha_image_to_base64",
145
+ # utils
146
+ "utc_naive_to_local",
147
+ "utc_naive_to_local_str",
148
+ # validation
149
+ "ValidationErrorItem",
150
+ "format_validation_errors",
151
+ "validation_errors_to_dict",
152
+ ]
@@ -0,0 +1,195 @@
1
+ # jalontsui_fastapi_kit.cache 使用指南
2
+
3
+ > **适用包**:`packages/jalontsui-fastapi-kit`
4
+ > **作用域**:所有需要缓存/消息队列连接的 Python 服务
5
+ > **最后更新**:2026-07-14
6
+
7
+ ---
8
+
9
+ ## 目录
10
+
11
+ 1. [设计定位](#1-设计定位)
12
+ 2. [目录结构](#2-目录结构)
13
+ 3. [快速开始](#3-快速开始)
14
+ 4. [创建 Redis 客户端](#4-创建-redis-客户端)
15
+ 5. [URL 格式](#5-url-格式)
16
+ 6. [健康检查](#6-健康检查)
17
+ 7. [关闭客户端](#7-关闭客户端)
18
+ 8. [扩展其他缓存后端](#8-扩展其他缓存后端)
19
+ 9. [最佳实践](#9-最佳实践)
20
+
21
+ ---
22
+
23
+ ## 1. 设计定位
24
+
25
+ `jalontsui_fastapi_kit.cache` 是项目统一的缓存/消息队列连接基础设施:
26
+
27
+ - 目前提供 **Redis 异步客户端工厂**。
28
+ - 未来可按同样模式新增 **Kafka、RabbitMQ、NATS** 等后端模块。
29
+ - 对业务代码屏蔽连接细节,统一通过 URL 创建客户端。
30
+
31
+ ---
32
+
33
+ ## 2. 目录结构
34
+
35
+ ```text
36
+ packages/jalontsui-fastapi-kit/src/jalontsui_fastapi_kit/cache/
37
+ ├── __init__.py # 公共 API 导出
38
+ └── redis.py # Redis 异步客户端工厂
39
+ ```
40
+
41
+ ---
42
+
43
+ ## 3. 快速开始
44
+
45
+ ```python
46
+ from jalontsui_fastapi_kit.cache import create_redis_client
47
+
48
+ client = create_redis_client("redis://localhost:6379/0")
49
+
50
+ await client.ping()
51
+ await client.set("key", "value", ex=60)
52
+ value = await client.get("key")
53
+
54
+ await client.close()
55
+ ```
56
+
57
+ ---
58
+
59
+ ## 4. 创建 Redis 客户端
60
+
61
+ ```python
62
+ from jalontsui_fastapi_kit.cache import create_redis_client, RedisClient
63
+
64
+ client: RedisClient = create_redis_client(
65
+ "redis://:mypassword@localhost:6379/0",
66
+ decode_responses=True, # 默认开启,自动解码为字符串
67
+ socket_connect_timeout=5,
68
+ socket_keepalive=True,
69
+ health_check_interval=30,
70
+ )
71
+ ```
72
+
73
+ ### 常用参数
74
+
75
+ | 参数 | 说明 | 默认值 |
76
+ |------|------|--------|
77
+ | `url` | Redis 连接串 | 必填 |
78
+ | `decode_responses` | 是否自动解码响应 | `True` |
79
+ | `socket_connect_timeout` | 连接超时(秒) | 依赖 redis-py 默认 |
80
+ | `socket_keepalive` | 是否保持长连接 | `False` |
81
+ | `health_check_interval` | 健康检查间隔(秒) | `0` |
82
+
83
+ 更多参数见 [redis-py 文档](https://redis-py.readthedocs.io/en/stable/connections.html)。
84
+
85
+ ---
86
+
87
+ ## 5. URL 格式
88
+
89
+ ```text
90
+ redis://[:password@]host:port/db
91
+ ```
92
+
93
+ 示例:
94
+
95
+ ```text
96
+ redis://localhost:6379/0
97
+ redis://:mypassword@redis.example.com:6379/0
98
+ rediss://:mypassword@redis.example.com:6380/0 # SSL
99
+ ```
100
+
101
+ 在 `packages/web` 中,可通过 `settings.redis_url` 获取统一构建的连接串:
102
+
103
+ ```python
104
+ from web.config import settings
105
+ from jalontsui_fastapi_kit.cache import create_redis_client
106
+
107
+ client = create_redis_client(settings.redis_url)
108
+ ```
109
+
110
+ ---
111
+
112
+ ## 6. 健康检查
113
+
114
+ `jalontsui_fastapi_kit.health.check_redis` 可探测 Redis 是否可达:
115
+
116
+ ```python
117
+ from jalontsui_fastapi_kit.cache import create_redis_client
118
+ from jalontsui_fastapi_kit.health import check_redis
119
+
120
+ client = create_redis_client("redis://localhost:6379/0")
121
+ result = await check_redis(client)
122
+
123
+ print(result.status) # "ok" or "error"
124
+ print(result.latency_ms) # 延迟毫秒
125
+ ```
126
+
127
+ 在 FastAPI `/health` 端点中的典型用法:
128
+
129
+ ```python
130
+ from jalontsui_fastapi_kit.cache import create_redis_client
131
+ from jalontsui_fastapi_kit.health import HealthChecker, check_database, check_redis
132
+ from web.config import settings
133
+ from web.database import AsyncSessionLocal
134
+
135
+ redis_client = create_redis_client(settings.redis_url)
136
+
137
+ checker = HealthChecker()
138
+ checker.register("database", lambda: check_database(async_session))
139
+ checker.register("redis", lambda: check_redis(redis_client))
140
+
141
+ response = await checker.run()
142
+ ```
143
+
144
+ ---
145
+
146
+ ## 7. 关闭客户端
147
+
148
+ ```python
149
+ await client.close()
150
+ ```
151
+
152
+ 在 FastAPI `lifespan` 中集中管理:
153
+
154
+ ```python
155
+ from contextlib import asynccontextmanager
156
+ from fastapi import FastAPI
157
+ from jalontsui_fastapi_kit.cache import create_redis_client
158
+ from web.config import settings
159
+
160
+ redis_client = create_redis_client(settings.redis_url)
161
+
162
+ @asynccontextmanager
163
+ async def lifespan(app: FastAPI):
164
+ yield
165
+ await redis_client.close()
166
+ ```
167
+
168
+ ---
169
+
170
+ ## 8. 扩展其他缓存后端
171
+
172
+ 未来新增缓存/消息队列后端的步骤:
173
+
174
+ 1. 在 `packages/jalontsui-fastapi-kit/pyproject.toml` 安装对应依赖。
175
+ 2. 在 `common/cache/` 下新增模块,例如 `common/cache/kafka.py`。
176
+ 3. 在 `common/cache/__init__.py` 中导出新的工厂函数。
177
+
178
+ 示例结构:
179
+
180
+ ```text
181
+ common/cache/
182
+ ├── __init__.py
183
+ ├── redis.py
184
+ └── kafka.py
185
+ ```
186
+
187
+ ---
188
+
189
+ ## 9. 最佳实践
190
+
191
+ - **统一使用 URL 创建客户端**:避免在业务代码中分散拼接 host/port/password。
192
+ - **配置集中管理**:推荐在 `Settings` 中提供 `redis_url` 属性。
193
+ - **生命周期统一管理**:应用启动时创建,关闭时 `close()` 释放。
194
+ - **生产环境启用 SSL**:使用 `rediss://` 协议。
195
+ - **合理设置超时**:避免网络抖动导致请求长时间挂起。
@@ -0,0 +1,14 @@
1
+ """通用缓存/消息队列连接工具.
2
+
3
+ 目前提供 Redis 异步客户端工厂,后续可按同样模式新增
4
+ Kafka、RabbitMQ、NATS 等后端模块.
5
+ """
6
+
7
+ from redis.asyncio import Redis as RedisClient
8
+
9
+ from jalontsui_fastapi_kit.cache.redis import create_redis_client
10
+
11
+ __all__ = [
12
+ "RedisClient",
13
+ "create_redis_client",
14
+ ]