faster-app


Namefaster-app JSON
Version 0.0.17 PyPI version JSON
download
home_pageNone
Summary一个轻量级的 Python Web 框架,提供自动发现、模型基类、命令行工具等功能
upload_time2025-09-12 07:34:40
maintainerNone
docs_urlNone
authorNone
requires_python>=3.12
licenseNone
keywords web framework fastapi tortoise orm cli
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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"
}
        
Elapsed time: 1.66469s