最近开源了我开发多年的一个 Python 后端框架:UtilMeta

项目介绍

UtilMeta 是一个用于开发 API 服务的后端元框架,基于 Python 类型注解标准高效构建声明式接口与 ORM 查询,能够自动解析请求参数与生成 OpenAPI 文档,高效开发 RESTful 接口,产出的代码简洁清晰,并且支持使用主流 Python 框架(如 Django, Flask, FastAPI, Starlette, Sanic, Tornado 等)作为运行时实现或渐进式整合

  • Github 仓库
  • 中文文档

安装

pip install utilmeta

核心特性

声明式接口开发

使用 UtilMeta 框架提供的声明能力,你可以轻松开发自动校验请求与生成 OpenAPI 文档的接口,也可以编写简洁的声明式 ORM 查询(支持关系对象查询且自动避免 N + 1 问题)

下面的例子是基于 Django 模型开发一个简洁的文章查询接口

from utilmeta.core import api, orm
from django.db import models

class User(models.Model):
    username = models.CharField(max_length=20, unique=True)

class Article(models.Model):
    author = models.ForeignKey(User, related_name="articles", on_delete=models.CASCADE)
    content = models.TextField()

class UserSchema(orm.Schema[User]):
    username: str
    articles_num: int = models.Count('articles')

class ArticleSchema(orm.Schema[Article]):
    id: int
    author: UserSchema
    content: str

class ArticleAPI(api.API):
    async def get(self, id: int) -> ArticleSchema:
        return awAIt ArticleSchema.ainit(id)

如果请求 GET /article?id=1,则会得到类似如下的结果

{
  "id": 1,
  "author": {
    "username": "alice",
    "articles_num": 3
  },
  "content": "hello world"
}

完全符合你的模式声明,并且会自动生成对应的 OpenAPI 文档,如

UtilMeta - 简洁高效的 Python 后端元框架

简洁的声明式开发可以显著降低接口开发的代码量,比如 UtilMeta 仅用 600 行代码就实现了 Realworld 博客后端, 与其他框架的对比如下

UtilMeta - 简洁高效的 Python 后端元框架

渐进式元框架

使用一套标准支持主流 Python 框架作为 HTTP 运行时实现,切换运行时实现只需要一个参数

from utilmeta import UtilMeta
from utilmeta.core import api
import django

class RootAPI(api.API):
    @api.get
    def hello(self):
        return 'world'

service = UtilMeta(
    __name__,
    name='demo',
    backend=django,    # or flask / starlette / tornado / sanic
    api=RootAPI,
    route='/api'
)

app = service.application()  # wsgi app

if __name__ == '__main__':
    service.run()

并且支持以接口为粒度渐进式接入现有项目,比如 Flask

from flask import Flask
from utilmeta.core import api, response

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"

class CalcAPI(api.API):
    @api.get
    def add(self, a: int, b: int) -> int:
        return a + b

CalcAPI.__as__(app, route='/calc')

高度可扩展与丰富的插件

内置一系列开箱即用的鉴权(Session / JWT),跨域处理,重试,请求控制,事务等插件

全周期监控运维解决方案

UtilMeta 框架配套了一个全周期的 API 管理平台,可以一站式解决中小团队的接口文档调试,日志查询,服务器监控,报警通知与事件管理等运维与管理需求(目前处于 Beta waitlist)

UtilMeta - 简洁高效的 Python 后端元框架

快速开始

你可以从下面几个由易到难的入门案例开始上手 UtilMeta 框架

  1. BMI 计算 API
  2. 用户注册登录查询 API
  3. Realworld 博客项目

如果你更希望从具体功能或用法入手学习,则可以参考

  • 处理请求参数:如何处理路径参数,查询参数,请求体和请求头,以及如何处理文件上传
  • API 类与接口路由:如何使用 API 类挂载简洁地定义树状接口路由,以及利用钩子等特性方便地在接口间复用代码,处理错误,模板化响应
  • 数据查询与 ORM 操作:如何使用 Schema 声明式地编写 RESTful 接口所需要的增删改查和 ORM 操作
  • 接口与用户鉴权:如何使用 Session, JWT, OAuth 等方式为接口的请求鉴权,获取当前请求用户与简化登录操作
  • 配置运行与部署:如何使用声明式环境变量等特性配置服务的运行设置,启动与部署
  • 从现有项目迁移:如何从现有的后端项目中渐进式地接入 UtilMeta 接口或迁移到 UtilMeta

社区

如果你觉得这个项目不错,可以帮我们的 Github 仓库 点个 ⭐~

你也可以加入我们社区获取项目的最新进展或参与讨论

  • Discord
  • X(Twitter)
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。