sanic-api


Namesanic-api JSON
Version 0.5.2 PyPI version JSON
download
home_pageNone
SummarySanic 框架实用API工具集,拥有自动生成文档、参数校验、配置的导入、日志功能的优化等功能,更好的助力接口的开发
upload_time2025-07-26 04:17:33
maintainerNone
docs_urlNone
authorNone
requires_python>=3.10
licenseNone
keywords sanic sanic扩展 异步
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            [![MIT License](https://img.shields.io/badge/License-MIT-green.svg)](https://choosealicense.com/licenses/mit/)
[![Python](https://img.shields.io/badge/Python-3.10+-yellow.svg?logo=python)]()
[![Sanic](https://img.shields.io/badge/framework-Sanic-Server.svg)](http://www.gnu.org/licenses/agpl-3.0)

# Sanic-API

让您的sanic服务程序更好的支持API文档、参数校验、日志打印、响应规范等

## 特性

- 无需任何多余改动,全自动生成openapi文档,使用更加方便 (新版方案正在积极优化开发中)

- 基于`pydantic`的参数校验器,让接口的请求及响应更符合你的预期,使用更方便

- 使用`loguru`库代替官方`logging`日志库,并对访问日志进行扩展,支持写入文件及推送loki

- 使用了基于`pydantic-settings`的项目配置方案,支持json、yml、ini、.env等多种格式

- 对sanic的启动进行了简单的封装,可快速启动项目


## 截图

## 路线图

- 全自动生成openapi文档

- 编写详细文档

## 安装

使用 pip 安装 sanic-api

```bash
  pip install sanic-api
```

## 使用方法/示例

### 最小示例
```python
from sanic_api.app import BaseApp


class App(BaseApp):
    """
    最小的sanic服务示例
    """


if __name__ == "__main__":
    App.run()
```

### 带参数校验的示例
```python
from pydantic import BaseModel, Field
from sanic import Blueprint, Sanic, json
from sanic.log import logger

from sanic_api.api import BaseRespTml, Request
from sanic_api.app import BaseApp

user_blueprint = Blueprint("user", "/user")


class UserInfoModel(BaseModel):
    user_id: int = Field(title="用户ID")


class UserInfoResponse(BaseRespTml):
    user_name: str = Field(title="用户名")


class UseLoginRequest(Request):
    form_data: UserInfoModel


@user_blueprint.post("info")
async def user_info(request: Request, json_data: UserInfoModel):
    """
    获取用户信息
    """
    logger.info(f"data: {json_data}")
    info = UserInfoResponse(user_name="张三")
    info.temp_data.code = "0000"
    info.temp_data.msg = "查询成功"
    return info.resp()


@user_blueprint.post("login")
async def user_login(request: UseLoginRequest):
    """
    用户登录
    """
    logger.info(f"user_id: {request.form_data.user_id}")
    return json(request.form_data.model_dump())


class App(BaseApp):
    """
    服务示例
    """

    async def setup_route(self, app: Sanic):
        api = Blueprint.group(url_prefix="api")
        api.append(user_blueprint)
        app.blueprint(api)


if __name__ == "__main__":
    App.run()
```

## 开发

要部署这个项目,请先安装rye

```bash
  rye sync
```

## 文档
正在编写中,敬请期待
            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "sanic-api",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "Sanic, Sanic\u6269\u5c55, \u5f02\u6b65",
    "author": null,
    "author_email": "\u660a\u8272\u5c45\u58eb <xhrtxh@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/89/cc/40b1a859fcdacd15d3c9045cfa64deca85809a6526b6d87fd064ba54a3cb/sanic_api-0.5.2.tar.gz",
    "platform": null,
    "description": "[![MIT License](https://img.shields.io/badge/License-MIT-green.svg)](https://choosealicense.com/licenses/mit/)\n[![Python](https://img.shields.io/badge/Python-3.10+-yellow.svg?logo=python)]()\n[![Sanic](https://img.shields.io/badge/framework-Sanic-Server.svg)](http://www.gnu.org/licenses/agpl-3.0)\n\n# Sanic-API\n\n\u8ba9\u60a8\u7684sanic\u670d\u52a1\u7a0b\u5e8f\u66f4\u597d\u7684\u652f\u6301API\u6587\u6863\u3001\u53c2\u6570\u6821\u9a8c\u3001\u65e5\u5fd7\u6253\u5370\u3001\u54cd\u5e94\u89c4\u8303\u7b49\n\n## \u7279\u6027\n\n- \u65e0\u9700\u4efb\u4f55\u591a\u4f59\u6539\u52a8\uff0c\u5168\u81ea\u52a8\u751f\u6210openapi\u6587\u6863\uff0c\u4f7f\u7528\u66f4\u52a0\u65b9\u4fbf (\u65b0\u7248\u65b9\u6848\u6b63\u5728\u79ef\u6781\u4f18\u5316\u5f00\u53d1\u4e2d)\n\n- \u57fa\u4e8e`pydantic`\u7684\u53c2\u6570\u6821\u9a8c\u5668\uff0c\u8ba9\u63a5\u53e3\u7684\u8bf7\u6c42\u53ca\u54cd\u5e94\u66f4\u7b26\u5408\u4f60\u7684\u9884\u671f\uff0c\u4f7f\u7528\u66f4\u65b9\u4fbf\n\n- \u4f7f\u7528`loguru`\u5e93\u4ee3\u66ff\u5b98\u65b9`logging`\u65e5\u5fd7\u5e93\uff0c\u5e76\u5bf9\u8bbf\u95ee\u65e5\u5fd7\u8fdb\u884c\u6269\u5c55\uff0c\u652f\u6301\u5199\u5165\u6587\u4ef6\u53ca\u63a8\u9001loki\n\n- \u4f7f\u7528\u4e86\u57fa\u4e8e`pydantic-settings`\u7684\u9879\u76ee\u914d\u7f6e\u65b9\u6848\uff0c\u652f\u6301json\u3001yml\u3001ini\u3001.env\u7b49\u591a\u79cd\u683c\u5f0f\n\n- \u5bf9sanic\u7684\u542f\u52a8\u8fdb\u884c\u4e86\u7b80\u5355\u7684\u5c01\u88c5\uff0c\u53ef\u5feb\u901f\u542f\u52a8\u9879\u76ee\n\n\n## \u622a\u56fe\n\n## \u8def\u7ebf\u56fe\n\n- \u5168\u81ea\u52a8\u751f\u6210openapi\u6587\u6863\n\n- \u7f16\u5199\u8be6\u7ec6\u6587\u6863\n\n## \u5b89\u88c5\n\n\u4f7f\u7528 pip \u5b89\u88c5 sanic-api\n\n```bash\n  pip install sanic-api\n```\n\n## \u4f7f\u7528\u65b9\u6cd5/\u793a\u4f8b\n\n### \u6700\u5c0f\u793a\u4f8b\n```python\nfrom sanic_api.app import BaseApp\n\n\nclass App(BaseApp):\n    \"\"\"\n    \u6700\u5c0f\u7684sanic\u670d\u52a1\u793a\u4f8b\n    \"\"\"\n\n\nif __name__ == \"__main__\":\n    App.run()\n```\n\n### \u5e26\u53c2\u6570\u6821\u9a8c\u7684\u793a\u4f8b\n```python\nfrom pydantic import BaseModel, Field\nfrom sanic import Blueprint, Sanic, json\nfrom sanic.log import logger\n\nfrom sanic_api.api import BaseRespTml, Request\nfrom sanic_api.app import BaseApp\n\nuser_blueprint = Blueprint(\"user\", \"/user\")\n\n\nclass UserInfoModel(BaseModel):\n    user_id: int = Field(title=\"\u7528\u6237ID\")\n\n\nclass UserInfoResponse(BaseRespTml):\n    user_name: str = Field(title=\"\u7528\u6237\u540d\")\n\n\nclass UseLoginRequest(Request):\n    form_data: UserInfoModel\n\n\n@user_blueprint.post(\"info\")\nasync def user_info(request: Request, json_data: UserInfoModel):\n    \"\"\"\n    \u83b7\u53d6\u7528\u6237\u4fe1\u606f\n    \"\"\"\n    logger.info(f\"data: {json_data}\")\n    info = UserInfoResponse(user_name=\"\u5f20\u4e09\")\n    info.temp_data.code = \"0000\"\n    info.temp_data.msg = \"\u67e5\u8be2\u6210\u529f\"\n    return info.resp()\n\n\n@user_blueprint.post(\"login\")\nasync def user_login(request: UseLoginRequest):\n    \"\"\"\n    \u7528\u6237\u767b\u5f55\n    \"\"\"\n    logger.info(f\"user_id: {request.form_data.user_id}\")\n    return json(request.form_data.model_dump())\n\n\nclass App(BaseApp):\n    \"\"\"\n    \u670d\u52a1\u793a\u4f8b\n    \"\"\"\n\n    async def setup_route(self, app: Sanic):\n        api = Blueprint.group(url_prefix=\"api\")\n        api.append(user_blueprint)\n        app.blueprint(api)\n\n\nif __name__ == \"__main__\":\n    App.run()\n```\n\n## \u5f00\u53d1\n\n\u8981\u90e8\u7f72\u8fd9\u4e2a\u9879\u76ee\uff0c\u8bf7\u5148\u5b89\u88c5rye\n\n```bash\n  rye sync\n```\n\n## \u6587\u6863\n\u6b63\u5728\u7f16\u5199\u4e2d\uff0c\u656c\u8bf7\u671f\u5f85",
    "bugtrack_url": null,
    "license": null,
    "summary": "Sanic \u6846\u67b6\u5b9e\u7528API\u5de5\u5177\u96c6\uff0c\u62e5\u6709\u81ea\u52a8\u751f\u6210\u6587\u6863\u3001\u53c2\u6570\u6821\u9a8c\u3001\u914d\u7f6e\u7684\u5bfc\u5165\u3001\u65e5\u5fd7\u529f\u80fd\u7684\u4f18\u5316\u7b49\u529f\u80fd\uff0c\u66f4\u597d\u7684\u52a9\u529b\u63a5\u53e3\u7684\u5f00\u53d1",
    "version": "0.5.2",
    "project_urls": {
        "documentation": "https://github.com/x-haose/sanic-api",
        "homepage": "https://github.com/x-haose/sanic-api",
        "repository": "https://github.com/x-haose/sanic-api"
    },
    "split_keywords": [
        "sanic",
        " sanic\u6269\u5c55",
        " \u5f02\u6b65"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "54be46e0f2987a72ef00d0277f34def9e5dcbae87263ba15207d6ae5d51da563",
                "md5": "6fb10731481cc2c0b174afa5110d576d",
                "sha256": "a2b3ff2152ae1330c395171bfc8398ede730f4c0b0c746583c934bf2696aa1f4"
            },
            "downloads": -1,
            "filename": "sanic_api-0.5.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "6fb10731481cc2c0b174afa5110d576d",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 16125,
            "upload_time": "2025-07-26T04:17:31",
            "upload_time_iso_8601": "2025-07-26T04:17:31.690167Z",
            "url": "https://files.pythonhosted.org/packages/54/be/46e0f2987a72ef00d0277f34def9e5dcbae87263ba15207d6ae5d51da563/sanic_api-0.5.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "89cc40b1a859fcdacd15d3c9045cfa64deca85809a6526b6d87fd064ba54a3cb",
                "md5": "e666d73a18b7625d3be0d2985d253fb1",
                "sha256": "f68866b59b3555bcc7edfcca7e365eab44cf762d2b5f10e06283c05216d0a234"
            },
            "downloads": -1,
            "filename": "sanic_api-0.5.2.tar.gz",
            "has_sig": false,
            "md5_digest": "e666d73a18b7625d3be0d2985d253fb1",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 13206,
            "upload_time": "2025-07-26T04:17:33",
            "upload_time_iso_8601": "2025-07-26T04:17:33.148880Z",
            "url": "https://files.pythonhosted.org/packages/89/cc/40b1a859fcdacd15d3c9045cfa64deca85809a6526b6d87fd064ba54a3cb/sanic_api-0.5.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-26 04:17:33",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "x-haose",
    "github_project": "sanic-api",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "sanic-api"
}
        
Elapsed time: 0.82044s