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()
资源(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 包中。每个子包都是一个独立的附加功能包。 它们互相之间一般没有必然的关联,但是有些