首页 > 编程语言 >UtilMeta - 简洁高效的 Python 后端元框架

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

时间:2024-02-23 15:14:24浏览次数:38  
标签:__ 后端 Python UtilMeta 接口 models api API

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

项目介绍

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

安装

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 文档,如

drawing

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

drawing

渐进式元框架

使用一套标准支持主流 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)

drawing

快速开始

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

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

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

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

社区

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

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

或扫码添加 UtilMeta 框架作者的微信加入开发者微信群

drawing

标签:__,后端,Python,UtilMeta,接口,models,api,API
From: https://www.cnblogs.com/voidzxl/p/18029552/utilmeta-introduction

相关文章

  • python调用Javascript实践
    一、背景知识1、Node.jsjavacript的运行环境有两个:浏览器、node.jsNode.js是一个开源与跨平台的JavaScript运行时环境。它是一个可用于几乎任何项目的流行工具!Node.js在浏览器外运行V8JavaScript引擎(GoogleChrome的内核)。这使Node.js表现得非常出色。运行js的命......
  • python特殊的函数
    一、文件操作1.操作googlesheetcredentials_file_path=os.path.abspath("./credentials.json")#授权:authorize():这是pygsheets库中的一个函数,用于授权对GoogleSheets的访问。为了使用GoogleSheetsAPI,你需要有一个有效的OAuth2.0凭据,这个凭据通常是一......
  • Python打开https链接报错:unable to get local issuer certificate
    Python打开https链接报错:unabletogetlocalissuercertificate或安装Python3.10以上版本,需要openssl1.1.1以上版本,会导致openssl下面缺少证书,记录下安装方法问题描述:当使用urllib.urlopen打开一个https链接时抛出如下异常:urllib.error.URLError:<urlopenerror[SSL:......
  • Python使用GDAL
     调用GDAL库:fromosgeoimportgdalimportnumpyasnpimportcv2importmatplotlib.pyplotaspltimportmatplotlibnp.set_printoptions(threshold=np.inf)#使print大量数据不用符号...代替而显示所有dataset=gdal.Open("D:/modis/jf6.tif")print(dataset.Ge......
  • Python数据结构与算法05——快速排序
    快速排序:递归defquick_sort(aimlist,first,last):#打印当前排序状态print(aimlist)#如果子列表只有一个元素或没有元素,直接返回iffirst>=last:return#初始化低位、高位和中间值low=firstheigh=lastmid=aimli......
  • 腾讯云Linux服务器 前端Nginx+后端 项目部署
    一、前端项目部署1.安装nginx服务器:在root目录下创建services文件并下载nginx源文件【nginx-1.21.6.tar.gz】 建议尽量选择稳定版本下载  nginx官网下载地址​​​​cd/rootmkdirservicescdservicescurl-onginx-1.21.6.tar.gzhttp://nginx.org/download/......
  • 【Azure Function】示例运行 python durable function(model V2)
    问题描述参考官方文档(使用Python创建你的第一个持久函数:https://learn.microsoft.com/zh-cn/azure/azure-functions/durable/quickstart-python-vscode),部署后,却出现“Failedtoloadfunction”错误。在结合以上参考文档后,可以通过如下的步骤创建并运行PythonDurableFu......
  • 龙哥盟 Python 译文集 2024.2 更新
    每个程序员都应该知道的40个算法Python数学应用Python入门指南Python物联网入门指南Python比特币编程实用指南Python密码学实用指南Python数据结构和算法实用指南Python企业自动化实用指南PythonGPU编程实用指南Python物联网项目LearningScrapy中文版通......
  • python 3.10版本降为3.8版本
    1.安装pyenvpipintsall pyenv-win -ihttp://pypi.douban.com/simple/--trusted-hostpypi.douban.com 2.配置环境变量  3.安装3.8版本pyenvinstall3.8.04.项目中设置:pyenvlocal3.8.0全局设置:pyenvglobal3.8.05.确认版本已经切换:python--version ......
  • python正则表达式之
    1.Match从字符串起始位置开始匹配,两个参数(正则表达式,字符串).*代表匹配前面的字符无限次content='Hello1234567World_ThisisaRegexDemo'#通用匹配result=re.match('^Hello.*Demo$',content)print(result)print(result.group())print(result.span())贪婪......