Bali集成了 FastAPI 和 gRPC 的框架

联合创作 · 2023-09-27 12:07

Bali 基于 FastAPI 和 gRPC,简化了云原生微服务开发。如果你想让你的项目同时支持 HTTP 和 gRPC ,那么 Bali 可以帮助你很轻松的完成。 

Bali 的特性:
* 项目结构简单。
* 融合了 `SQLAlchemy` 并提供了 model 生成的方法。
* 提供了工具类转换 model 成为 Pydantic 模式.
* 支持 GZip 解压缩.
* 🍻 **Resource** 层处理对外服务即支持 HTTP 又支持 gRPC

谁在使用

 

依赖项:

1. Python 3.8+
2. FastAPI 0.63+
3. grpcio>=1.32.0,<1.42

安装:

pip install bali-core

创建应用:

import greeter_server

# Initialized App 
app = Bali()
# Updated settings
app.settings(base_settings={'title': 'Bali App'})

启动 HTTP & RPC:

# lauch RPC 
python main.py --rpc

# lauch HTTP
python main.py --http

数据库对象的使用:

### connect
from bali.core import db

# connect to database when app started
# db is a sqla-wrapper instance
db.connect('DATABASE_URI')  
  


### Declarative mode with sqla-wrapper

class User(db.Model):
    __tablename__ "users"
    id = db.Column(db.Integer, primary_key=True)
    ...

db.create_all()

db.add(User(...))
db.commit()

todos = db.query(User).all()

### Declare models inherit from convenient base models

## BaseModel

# using BaseModel
class User(db.BaseModel):
    __tablename__ "users"
    id = db.Column(db.Integer, primary_key=True)



# BaseModel's source code 

class BaseModel(db.Model):
    __abstract__ = True

    created_time = Column(DateTime(timezone=True), default=datetime.utcnow)
    updated_time = Column(
        DateTime(timezone=True), default=datetime.utcnow, onupdate=datetime.utcnow
    )
    is_active = Column(Boolean(), default=True)


### Transaction

# SQLA-wrapper default model behavior is auto commit, auto commit will be disabled with `db.transaction` context. 
with db.transaction():
    item = Item.create(name='test1')

### Operators

# Operators provided `get_filters_expr` to transform filters (dict) to SQLAlchemy expressions.  

from bali.db.operators import get_filters_expr
from models import User

users = User.query().filter(*get_filters_expr(User, **filters)).all()

Resource

资源(Resouce)的设计借鉴了REST架构风格的几个关键概念。HTTP 和 RPC 使用的是同一套 Resouce 代码,常用的 action 的对应关系如下:

Action Route Method RPC Description
get /{id} GET Get{Resource} Get an existing resource matching the given id
list / GET List{Resource} Get all the resources
create / POST Create{Resource} Create a new resource
update /{id} PATCH Update{Resource} Update an existing resource matching the given id
delete /{id} DELETE Delete{Resource} Delete an existing resource matching the given id

缓存的使用:

from bali.core import cache

# Usage example (API)

# Read cache 
cache.get(key)

# Set cache 
cache.set(key, value, timeout=10)

 

浏览 6
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报