资源
Resource
在版本 2.0. 中加入
Resource的设计借鉴了REST体系结构风格的几个关键概念。
灵感来自于Django REST框架中的' ViewSet '。
Actions 命名依据 Standard methods
in Google API design guide
通用 HTTP/RPC 支持操作
通用 HTTP/RPC 支持操作:
Action | Route | Method | RPC | Description |
---|---|---|---|---|
get | /{id} | GET | Get{Resource} | 获取与给定id匹配的现有资源 |
list | / | GET | List{Resource} | 获取所有资源 |
create | / | POST | Create{Resource} | 创建一个新的资源 |
update | /{id} | PATCH | Update{Resource} | 更新与给定 id 匹配的现有资源 |
delete | /{id} | DELETE | Delete{Resource} | 删除与给定 id 匹配的现有资源 |
通用示例:
# 1. import `Resource` base class
from bali.resources import Resource
# 2. implementation actions inherited from Resource
class GreeterResource(Resource):
schema = Greeter
@action()
def get(self, pk=None):
return [g for g in GREETERS if g.get('id') == pk][0]
@action()
def list(self, schema_in: ListRequest):
return GREETERS[:schema_in.limit]
@action()
def create(self, schema_in: schema):
return {'id': schema_in.id, 'content': schema_in.content}
@action()
def update(self, schema_in: schema, pk=None):
return {'id': pk, 'content': schema_in.content}
@action()
def delete(self, pk=None):
return {'id': pk, 'result': True} # using `id` instand of `result`
用户自定义 HTTP/RPC Actions
用户自定义的 Action 还是需要使用 @action
, 单是参数 detail
必须要设置.
@action(detail=False)
def custom_action(self):
pass
detail
没有默认值.
True
代表 action 对应的是单个资源, url 为 '/{resources}/{id}'.
False
代表 action 对应的是一个资源集, url 为 '/{resources}'.
重写 HTTP Actions
如果默认的HTTP动作模板不能满足您的请求,您可以覆盖HTTP动作。
# Get the origin router
router = GreeterResource.as_router()
# Override the actions using the FastAPI normal way
@router.get("/")
def root():
return {"message": "Hello World"}
更多关于
Resource
: GreeterResource
ModelResource
在版本 2.1. 中新增
class UserResource(ModelResource):
model = User
schema = UserSchema
filters = [
{'username': str},
{'age': Optional[str]},
] # yapf: disable
permission_classes = [IsAuthenticated]