# Faster APP
一个轻量级、高性能的 Python Web 框架,基于 FastAPI 和 Tortoise ORM 构建,提供自动发现、模型基类、命令行工具等企业级功能。
## ✨ 核心特性
- 🔍 **智能自动发现**: 自动扫描和加载模块、模型、路由和命令
- 🗄️ **丰富模型基类**: 基于 Tortoise ORM 的企业级模型基类
- 🛠️ **强大命令行工具**: 基于 Fire 的异步命令行工具框架
- 🌐 **统一路由管理**: FastAPI 路由的标准化返回格式
- 📦 **即插即用**: 模块化设计,开箱即用
- ⚡ **高性能**: 异步架构,支持高并发
- 🔧 **开发友好**: 内置数据库迁移、开发服务器等工具
## 🚀 快速安装
```bash
pip install faster_app
```
# 📖 快速开始
## 1. 项目结构
```
your-project/
├── apps/ # 应用目录
│ ├── auth/
│ │ ├── models.py # 模型定义
│ │ ├── routes.py # 路由定义
│ │ └── commands.py # 命令定义
│ └── user/
│ ├── models.py
│ ├── routes.py
│ └── commands.py
├── config/
└──── settings.py # 配置文件
```
### 2. 模型定义
```python
# models.py
from faster_app.models import UUIDModel, DateTimeModel, StatusModel
from tortoise import fields
class User(UUIDModel, DateTimeModel, StatusModel):
"""用户模型"""
name = fields.CharField(max_length=50, description="用户名")
email = fields.CharField(max_length=100, unique=True, description="邮箱")
class Meta:
table = "users"
table_description = "用户表"
```
### 3. 路由定义
```python
# routes.py
from fastapi import APIRouter
from faster_app.routes import ApiResponse
router = APIRouter(prefix="/api/v1/users", tags=["用户管理"])
@router.get("/", response_model=ApiResponse)
async def get_users():
"""获取用户列表"""
users = await User.all()
return ApiResponse(
message="获取用户列表成功",
data={"users": users, "total": len(users)}
)
@router.post("/", response_model=ApiResponse)
async def create_user(name: str, email: str):
"""创建用户"""
user = await User.create(name=name, email=email)
return ApiResponse(
message="用户创建成功",
data={"user": user}
)
```
### 4. 命令定义
```python
# commands.py
from faster_app.commands import BaseCommand
class UserCommand(BaseCommand):
"""用户管理命令"""
async def create_user(self, name: str, email: str):
"""创建用户"""
user = await User.create(name=name, email=email)
print(f"✅ 用户创建成功: {user.name} ({user.email})")
async def list_users(self):
"""列出所有用户"""
users = await User.all()
print(f"📋 共找到 {len(users)} 个用户:")
for user in users:
print(f" - {user.name} ({user.email})")
```
# 🛠️ 内置工具
### 1. 数据库管理
```bash
# 初始化数据库
python main.py db init_db
# 生成迁移文件
python main.py db migrate
# 执行迁移
python main.py db upgrade
# 回滚迁移
python main.py db downgrade
# 查看迁移历史
python main.py db history
# 清理开发环境
python main.py db dev_clean
```
### 2. 开发服务器
```bash
# 启动开发服务器
python main.py fastapi start
# 指定主机和端口
python main.py fastapi start --host=0.0.0.0 --port=8080
```
# ⚙️ 配置管理
> 默认配置,可以通过
```python
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
# 基础配置
PROJECT_NAME: str = ""
VERSION: str = "1.0.0"
DEBUG: bool = True
# 服务器配置
HOST: str = "127.0.0.1"
PORT: int = 8000
# API 配置
API_V1_STR: str = "/api/v1"
# JWT 配置
SECRET_KEY: str = "your-secret-key"
ALGORITHM: str = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES: int = 30
# 数据库配置
DB_ENGINE: str = "tortoise.backends.asyncpg"
DB_HOST: str = "localhost"
DB_PORT: int = 5432
DB_USER: str = "postgres"
DB_PASSWORD: str = "password"
DB_DATABASE: str = "mydb"
```
### 环境变量支持
创建 `.env` 文件:
```env
PROJECT_NAME=My API Project
DEBUG=true
DB_HOST=localhost
DB_PORT=5432
DB_USER=postgres
DB_PASSWORD=password
DB_DATABASE=mydb
SECRET_KEY=your-secret-key-here
```
## 🤝 贡献指南
我们欢迎所有形式的贡献!
### 如何贡献
1. Fork 本仓库
2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 开启 Pull Request
### 报告问题
如果您发现了 bug 或有功能建议,请在 [Issues](https://github.com/your-org/faster_app/issues) 中提交。
## 📄 许可证
本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情。
## 🙏 致谢
- [FastAPI](https://fastapi.tiangolo.com/) - 现代、快速的 Web 框架
- [Tortoise ORM](https://tortoise.github.io/) - 异步 ORM 框架
- [Fire](https://github.com/google/python-fire) - 命令行接口生成器
- [Pydantic](https://pydantic-docs.helpmanual.io/) - 数据验证库
- [Rich](https://rich.readthedocs.io/) - 终端美化库
**作者**: peizhenfei (peizhenfei@hotmail.com)
**项目主页**: [https://github.com/mautops/faster-app.git](https://github.com/mautops/faster-app.git)
Raw data
{
"_id": null,
"home_page": null,
"name": "faster-app",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.12",
"maintainer_email": "peizhenfei <peizhenfei@hotmail.com>",
"keywords": "web, framework, fastapi, tortoise, orm, cli",
"author": null,
"author_email": "peizhenfei <peizhenfei@hotmail.com>",
"download_url": "https://files.pythonhosted.org/packages/97/f0/d5f3811bf9c65e7b3759381ad9e71a3e1146874e10ab21ec7cde66c263ac/faster_app-0.0.17.tar.gz",
"platform": null,
"description": "# Faster APP\n\n\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u3001\u9ad8\u6027\u80fd\u7684 Python Web \u6846\u67b6\uff0c\u57fa\u4e8e FastAPI \u548c Tortoise ORM \u6784\u5efa\uff0c\u63d0\u4f9b\u81ea\u52a8\u53d1\u73b0\u3001\u6a21\u578b\u57fa\u7c7b\u3001\u547d\u4ee4\u884c\u5de5\u5177\u7b49\u4f01\u4e1a\u7ea7\u529f\u80fd\u3002\n\n## \u2728 \u6838\u5fc3\u7279\u6027\n\n- \ud83d\udd0d **\u667a\u80fd\u81ea\u52a8\u53d1\u73b0**: \u81ea\u52a8\u626b\u63cf\u548c\u52a0\u8f7d\u6a21\u5757\u3001\u6a21\u578b\u3001\u8def\u7531\u548c\u547d\u4ee4\n- \ud83d\uddc4\ufe0f **\u4e30\u5bcc\u6a21\u578b\u57fa\u7c7b**: \u57fa\u4e8e Tortoise ORM \u7684\u4f01\u4e1a\u7ea7\u6a21\u578b\u57fa\u7c7b\n- \ud83d\udee0\ufe0f **\u5f3a\u5927\u547d\u4ee4\u884c\u5de5\u5177**: \u57fa\u4e8e Fire \u7684\u5f02\u6b65\u547d\u4ee4\u884c\u5de5\u5177\u6846\u67b6\n- \ud83c\udf10 **\u7edf\u4e00\u8def\u7531\u7ba1\u7406**: FastAPI \u8def\u7531\u7684\u6807\u51c6\u5316\u8fd4\u56de\u683c\u5f0f\n- \ud83d\udce6 **\u5373\u63d2\u5373\u7528**: \u6a21\u5757\u5316\u8bbe\u8ba1\uff0c\u5f00\u7bb1\u5373\u7528\n- \u26a1 **\u9ad8\u6027\u80fd**: \u5f02\u6b65\u67b6\u6784\uff0c\u652f\u6301\u9ad8\u5e76\u53d1\n- \ud83d\udd27 **\u5f00\u53d1\u53cb\u597d**: \u5185\u7f6e\u6570\u636e\u5e93\u8fc1\u79fb\u3001\u5f00\u53d1\u670d\u52a1\u5668\u7b49\u5de5\u5177\n\n## \ud83d\ude80 \u5feb\u901f\u5b89\u88c5\n\n```bash\npip install faster_app\n```\n\n# \ud83d\udcd6 \u5feb\u901f\u5f00\u59cb\n\n## 1. \u9879\u76ee\u7ed3\u6784\n\n```\nyour-project/\n\u251c\u2500\u2500 apps/ # \u5e94\u7528\u76ee\u5f55\n\u2502 \u251c\u2500\u2500 auth/\n\u2502 \u2502 \u251c\u2500\u2500 models.py # \u6a21\u578b\u5b9a\u4e49\n\u2502 \u2502 \u251c\u2500\u2500 routes.py # \u8def\u7531\u5b9a\u4e49\n\u2502 \u2502 \u2514\u2500\u2500 commands.py # \u547d\u4ee4\u5b9a\u4e49\n\u2502 \u2514\u2500\u2500 user/\n\u2502 \u251c\u2500\u2500 models.py\n\u2502 \u251c\u2500\u2500 routes.py\n\u2502 \u2514\u2500\u2500 commands.py\n\u251c\u2500\u2500 config/\n\u2514\u2500\u2500\u2500\u2500 settings.py # \u914d\u7f6e\u6587\u4ef6\n```\n\n### 2. \u6a21\u578b\u5b9a\u4e49\n\n```python\n# models.py\nfrom faster_app.models import UUIDModel, DateTimeModel, StatusModel\nfrom tortoise import fields\n\nclass User(UUIDModel, DateTimeModel, StatusModel):\n \"\"\"\u7528\u6237\u6a21\u578b\"\"\"\n name = fields.CharField(max_length=50, description=\"\u7528\u6237\u540d\")\n email = fields.CharField(max_length=100, unique=True, description=\"\u90ae\u7bb1\")\n\n class Meta:\n table = \"users\"\n table_description = \"\u7528\u6237\u8868\"\n```\n\n### 3. \u8def\u7531\u5b9a\u4e49\n\n```python\n# routes.py\nfrom fastapi import APIRouter\nfrom faster_app.routes import ApiResponse\n\nrouter = APIRouter(prefix=\"/api/v1/users\", tags=[\"\u7528\u6237\u7ba1\u7406\"])\n\n@router.get(\"/\", response_model=ApiResponse)\nasync def get_users():\n \"\"\"\u83b7\u53d6\u7528\u6237\u5217\u8868\"\"\"\n users = await User.all()\n return ApiResponse(\n message=\"\u83b7\u53d6\u7528\u6237\u5217\u8868\u6210\u529f\",\n data={\"users\": users, \"total\": len(users)}\n )\n\n@router.post(\"/\", response_model=ApiResponse)\nasync def create_user(name: str, email: str):\n \"\"\"\u521b\u5efa\u7528\u6237\"\"\"\n user = await User.create(name=name, email=email)\n return ApiResponse(\n message=\"\u7528\u6237\u521b\u5efa\u6210\u529f\",\n data={\"user\": user}\n )\n```\n\n### 4. \u547d\u4ee4\u5b9a\u4e49\n\n```python\n# commands.py\nfrom faster_app.commands import BaseCommand\n\nclass UserCommand(BaseCommand):\n \"\"\"\u7528\u6237\u7ba1\u7406\u547d\u4ee4\"\"\"\n\n async def create_user(self, name: str, email: str):\n \"\"\"\u521b\u5efa\u7528\u6237\"\"\"\n user = await User.create(name=name, email=email)\n print(f\"\u2705 \u7528\u6237\u521b\u5efa\u6210\u529f: {user.name} ({user.email})\")\n\n async def list_users(self):\n \"\"\"\u5217\u51fa\u6240\u6709\u7528\u6237\"\"\"\n users = await User.all()\n print(f\"\ud83d\udccb \u5171\u627e\u5230 {len(users)} \u4e2a\u7528\u6237:\")\n for user in users:\n print(f\" - {user.name} ({user.email})\")\n```\n\n# \ud83d\udee0\ufe0f \u5185\u7f6e\u5de5\u5177\n\n### 1. \u6570\u636e\u5e93\u7ba1\u7406\n\n```bash\n# \u521d\u59cb\u5316\u6570\u636e\u5e93\npython main.py db init_db\n\n# \u751f\u6210\u8fc1\u79fb\u6587\u4ef6\npython main.py db migrate\n\n# \u6267\u884c\u8fc1\u79fb\npython main.py db upgrade\n\n# \u56de\u6eda\u8fc1\u79fb\npython main.py db downgrade\n\n# \u67e5\u770b\u8fc1\u79fb\u5386\u53f2\npython main.py db history\n\n# \u6e05\u7406\u5f00\u53d1\u73af\u5883\npython main.py db dev_clean\n```\n\n### 2. \u5f00\u53d1\u670d\u52a1\u5668\n\n```bash\n# \u542f\u52a8\u5f00\u53d1\u670d\u52a1\u5668\npython main.py fastapi start\n\n# \u6307\u5b9a\u4e3b\u673a\u548c\u7aef\u53e3\npython main.py fastapi start --host=0.0.0.0 --port=8080\n```\n\n# \u2699\ufe0f \u914d\u7f6e\u7ba1\u7406\n\n> \u9ed8\u8ba4\u914d\u7f6e\uff0c\u53ef\u4ee5\u901a\u8fc7\n\n```python\nfrom pydantic_settings import BaseSettings\n\nclass Settings(BaseSettings):\n # \u57fa\u7840\u914d\u7f6e\n PROJECT_NAME: str = \"\"\n VERSION: str = \"1.0.0\"\n DEBUG: bool = True\n\n # \u670d\u52a1\u5668\u914d\u7f6e\n HOST: str = \"127.0.0.1\"\n PORT: int = 8000\n\n # API \u914d\u7f6e\n API_V1_STR: str = \"/api/v1\"\n\n # JWT \u914d\u7f6e\n SECRET_KEY: str = \"your-secret-key\"\n ALGORITHM: str = \"HS256\"\n ACCESS_TOKEN_EXPIRE_MINUTES: int = 30\n\n # \u6570\u636e\u5e93\u914d\u7f6e\n DB_ENGINE: str = \"tortoise.backends.asyncpg\"\n DB_HOST: str = \"localhost\"\n DB_PORT: int = 5432\n DB_USER: str = \"postgres\"\n DB_PASSWORD: str = \"password\"\n DB_DATABASE: str = \"mydb\"\n```\n\n### \u73af\u5883\u53d8\u91cf\u652f\u6301\n\n\u521b\u5efa `.env` \u6587\u4ef6\uff1a\n\n```env\nPROJECT_NAME=My API Project\nDEBUG=true\nDB_HOST=localhost\nDB_PORT=5432\nDB_USER=postgres\nDB_PASSWORD=password\nDB_DATABASE=mydb\nSECRET_KEY=your-secret-key-here\n```\n\n## \ud83e\udd1d \u8d21\u732e\u6307\u5357\n\n\u6211\u4eec\u6b22\u8fce\u6240\u6709\u5f62\u5f0f\u7684\u8d21\u732e\uff01\n\n### \u5982\u4f55\u8d21\u732e\n\n1. Fork \u672c\u4ed3\u5e93\n2. \u521b\u5efa\u7279\u6027\u5206\u652f (`git checkout -b feature/AmazingFeature`)\n3. \u63d0\u4ea4\u66f4\u6539 (`git commit -m 'Add some AmazingFeature'`)\n4. \u63a8\u9001\u5230\u5206\u652f (`git push origin feature/AmazingFeature`)\n5. \u5f00\u542f Pull Request\n\n### \u62a5\u544a\u95ee\u9898\n\n\u5982\u679c\u60a8\u53d1\u73b0\u4e86 bug \u6216\u6709\u529f\u80fd\u5efa\u8bae\uff0c\u8bf7\u5728 [Issues](https://github.com/your-org/faster_app/issues) \u4e2d\u63d0\u4ea4\u3002\n\n## \ud83d\udcc4 \u8bb8\u53ef\u8bc1\n\n\u672c\u9879\u76ee\u91c7\u7528 MIT \u8bb8\u53ef\u8bc1 - \u67e5\u770b [LICENSE](LICENSE) \u6587\u4ef6\u4e86\u89e3\u8be6\u60c5\u3002\n\n## \ud83d\ude4f \u81f4\u8c22\n\n- [FastAPI](https://fastapi.tiangolo.com/) - \u73b0\u4ee3\u3001\u5feb\u901f\u7684 Web \u6846\u67b6\n- [Tortoise ORM](https://tortoise.github.io/) - \u5f02\u6b65 ORM \u6846\u67b6\n- [Fire](https://github.com/google/python-fire) - \u547d\u4ee4\u884c\u63a5\u53e3\u751f\u6210\u5668\n- [Pydantic](https://pydantic-docs.helpmanual.io/) - \u6570\u636e\u9a8c\u8bc1\u5e93\n- [Rich](https://rich.readthedocs.io/) - \u7ec8\u7aef\u7f8e\u5316\u5e93\n\n**\u4f5c\u8005**: peizhenfei (peizhenfei@hotmail.com)\n\n**\u9879\u76ee\u4e3b\u9875**: [https://github.com/mautops/faster-app.git](https://github.com/mautops/faster-app.git)\n",
"bugtrack_url": null,
"license": null,
"summary": "\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684 Python Web \u6846\u67b6\uff0c\u63d0\u4f9b\u81ea\u52a8\u53d1\u73b0\u3001\u6a21\u578b\u57fa\u7c7b\u3001\u547d\u4ee4\u884c\u5de5\u5177\u7b49\u529f\u80fd",
"version": "0.0.17",
"project_urls": {
"Bug Tracker": "https://github.com/mautops/faster_app/issues",
"Documentation": "https://github.com/mautops/faster_app#readme",
"Homepage": "https://github.com/mautops/faster_app",
"Repository": "https://github.com/mautops/faster_app.git"
},
"split_keywords": [
"web",
" framework",
" fastapi",
" tortoise",
" orm",
" cli"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "bc2867d67c4b5edd17cee63e84c1985600746a4e38f948a274e0a544afb3f130",
"md5": "f55bd8e1f0272c91136efab1d91144a5",
"sha256": "9bda0375c6c122ed4912f1756804195751713d1c4d90357f48dddbc9984fe138"
},
"downloads": -1,
"filename": "faster_app-0.0.17-py3-none-any.whl",
"has_sig": false,
"md5_digest": "f55bd8e1f0272c91136efab1d91144a5",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.12",
"size": 583461,
"upload_time": "2025-09-12T07:34:38",
"upload_time_iso_8601": "2025-09-12T07:34:38.566329Z",
"url": "https://files.pythonhosted.org/packages/bc/28/67d67c4b5edd17cee63e84c1985600746a4e38f948a274e0a544afb3f130/faster_app-0.0.17-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "97f0d5f3811bf9c65e7b3759381ad9e71a3e1146874e10ab21ec7cde66c263ac",
"md5": "834b69114a214c1eac713ef9b790336c",
"sha256": "db8c568153358159e8f0875de5a8155a349df6df7b349ef6edd52784d6557eec"
},
"downloads": -1,
"filename": "faster_app-0.0.17.tar.gz",
"has_sig": false,
"md5_digest": "834b69114a214c1eac713ef9b790336c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.12",
"size": 567213,
"upload_time": "2025-09-12T07:34:40",
"upload_time_iso_8601": "2025-09-12T07:34:40.646463Z",
"url": "https://files.pythonhosted.org/packages/97/f0/d5f3811bf9c65e7b3759381ad9e71a3e1146874e10ab21ec7cde66c263ac/faster_app-0.0.17.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-12 07:34:40",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "mautops",
"github_project": "faster_app",
"github_not_found": true,
"lcname": "faster-app"
}