当前位置: 首页 > 软件库 > 云计算 > 云原生 >

Bali

集成了 FastAPI 和 gRPC 的框架
授权协议 MIT
开发语言 Python
所属分类 云计算、 云原生
软件类型 开源软件
地区 国产
投 递 者 百里弘致
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

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)

 

  • 题意: 巴厘岛的一条主干道上共有 N N N 座雕塑,依次编号为 1 1 1 到 N N N。雕塑 i i i 的年龄为 Y i Y_i Yi​。 政府想把这些雕塑分成恰好 X X X 组,要求 A ≤ X ≤ B A≤X≤B A≤X≤B。每组不能为空,且每组雕塑的编号必须连续。每个雕塑必须属于某一组。 分组方案需要考虑美观程度。计算方法如下:分别计算每组雕塑的年龄之和,然后将每一组的结果按位取或

  • 题意 n个东西,要你连续的分一组,使得所有组都非空,且组数在a到b之间,满足上述条件的前提下使得贡献最小,定义贡献为每组的和,然后全部或起来 1≤N≤2000,1≤B≤N,A=1 1 ≤ N ≤ 2000 , 1 ≤ B ≤ N , A = 1 1≤N≤100,1≤A≤B≤N 1 ≤ N ≤ 100 , 1 ≤ A ≤ B ≤ N 0≤Yi≤1000000000 0 ≤ Y i ≤ 1000000

  • 贪心+二进制按位DP 我们需要让答案尽量小,即让答案的二进制位的高位尽量为0。可以一位一位做,同时要保证前面做过的位的答案不变。 前4个子任务,记f[i][j]表示前i个数分成j组,且符合当前答案的方案是否存在。那么它可以从一个合法的f[k][j-1] (k < i) 转移过来。这样是O(n^3*logn)的。 第5个子任务用上面的方法会T。考虑到A=1,即没有分组下界。记g[i]表示前i个数符合

  • 好像大家的做法都是最短路。 由于边权都是1嘛,所以我就二五二五的动手bfs了…… 但是纯搜好像是不行的,大家还好心提醒我uoj卡的很严,会TLE,所以我就用了一些bool数组记录,要是算过了就不再算了(这好像是废话2333) 由于刚学了莫队算法(不知道莫队的戳这里),所以对分块思想的印象比较深,于是就开始分块水这个题目23333 大概做法是取一个限制ss,如果狗跳的距离小于ss,就用数组记下来;否

  • 题目链接 算法:          首先有这样一个贪心策略:将答案转成二进制考虑,从高位到低位枚举,对于当前这一位,除非它在最优策略下只可能是1,否则我把这位设成0,沿着这个思路我们分两类考虑:          (1)对于1<=A<=B<=N的数据,我们将答案从高位向低位枚举,设f[i][j]表示将前i个数分成j组的方案中,是否存在可以使当前这一位为0的方案(0为没有,1为有),所以三重循环分别

  • 看到这种求位运算的问题一定要想直接对答案贪心啊,从高位枚举到低位,设当前的位为pos,pos之前贪心得到的答案为ans。 现在的问题就是能否找到一种方案,使得pos这一位为0,而且满足这种方案算出来的答案的前若干位与ans相同。 考虑设f[i][j]表示前i个数,分j份能否满足条件,0为满足,若存在一个k使得 f[k][j−1]==0,(s[i]−s[k])and(1<<pos)==0,(((an

  • 题解 感觉自己通过刷水题混LOJ刷题量非常成功 首先是二进制枚举位,判是否合法 要写两个solve不是很开心,\(A\)不为1的直接记录状态\(f[i][j]\)为能否到达前\(i\)个分成\(j\)段,转移\(n^3\) \(A\)为1的相当于在一张拓扑图上求到\(N\)的最短路是否小与\(B\),连边方式即为如果\(sum[j] - sum[k]\)是二分值的一个子集则\(k\)到\(j\)有

  • Today Bali Balo, a French designer and developer, published a new piece: a cube suspended in darkness that rotates on its own. As it does, it reveals different sides, each offering a glimpse into a di

  • 摘要: We mapped the temple, the irrigation canals that flow out of it, and the fields that depend on this flow (Figure 17.2). We also sank 18 soil cores to a depth of up to 5 meters and carried out anal

  • 摘要: Media pembelajaran adalah sebuah media interaktif yang digunakan untuk menyampaikan informasi tertentu kepada khalayak umum yang diharapkan informasi ini lebih cepat diserap dan diterima oleh masy

 相关资料
  • 问题内容: 我已经开发了一个Spring / JPA应用程序: 服务,存储库和域层即将完成 。 该 所缺的只是层是网络层 。我正在考虑将Playframework 2.0用于Web层,但不确定是否可以 在Playframework 2.0类中注入/使用spring bean 。 这可能吗?如果可以,怎么办? 问题答案: 您可以。已针对Play 2.5.x更新: https://github.com

  • 本文向大家介绍Spring集成MyBatis框架,包括了Spring集成MyBatis框架的使用技巧和注意事项,需要的朋友参考一下 Java在写数据库查询时,我接触过四种方式: 1、纯Java代码,引用对应的数据库驱动包,自己写连接与释放逻辑(可以用连接池) 这种模式实际上性能是非常不错的,但是使用起来并不是非常方便:一是要手工为Connection做获取与释放,大量的冗余代码也容易出错;另一个是

  • 如果你正在建设一个纯静态的应用程序(与后端api分离部署),那么你可能甚至不需要编辑config/index.js。但是,如果你想要这个模板与现有的后端框架集成,例如Rails/Django/Laravel,拥有自己的项目结构,您可以编辑config/index.js,直接生成前端资源注入到你的后台项目。 让我们看一下默认的config/index.js: var path = require('

  • 问题内容: 我使用JADE框架作为依赖项创建了一个maven项目,但是与普通的Java应用程序相比,该框架需要不同的命令来执行jar。 建立: 跑: 哪里是 要么 是否可以使用maven插件构建 可运行的jar, 所以我只需键入而不是上面的命令? 将编辑命令后Eclipse项目的变化构建参数 的pom.xml 文件? 问题答案: JADE没有可用的此类插件,因为它没有得到广泛使用的框架,而且没有人

  • 问题内容: 今天有人与bluebird提出了一个有趣的案例,这是处理多重承诺的最佳方法,即我们对停止履行既定的目标或拒绝不感兴趣,而对检查最终结果感兴趣。一个例子: 在这里,如果我们运行map或所有被拒绝的promise将导致处理程序不报告结果。 例如,如上所述实现的运行Promise.map的结果是: 此处执行每个promise的代码,但仅报告1个结果和1个错误。该错误导致进程停止。 如果我们取

  • Python 有众多优点,其中之一就是“开机即用”原则:安装 Python 的同时安装好大量的标准软件包,这样 你可以立即使用而不用自己去下载。Django 也遵循这个原则,它同样包含了自己的标准库。这一章就来讲 这些集成的子框架。 Django 标准库 Django 的标准库存放在 django.contrib 包中。每个子包都是一个独立的附加功能包。 它们互相之间一般没有必然的关联,但是有些