为简单的SQLAlchemy对象添加REST接口
项目描述
使用它
在 <project>/model.py
from pyramid.security import Allow, Authenticated, ALL_PERMISSIONS
class Object(Base):
__tablename__ = 'object'
__table_args__ = {'autoload':True}
__acl__ = [
(Allow, 'admin', ALL_PERMISSIONS),
(Allow, 'editor', ('view', 'edit', 'new', 'delete')),
(Allow, Authenticated, ('view')),
]
在 <project>/views/rest.py
from pyramid.view import view_config
from c2c.sqlalchemy.rest import REST
from <project>.models import DBSession, Object
obj = REST(DBSession, Object)
@view_config(route_name='obj_read_many', renderer='jsonp')
def obj_read_many(request):
return obj.read_many(request)
@view_config(route_name='obj_read_one', renderer='jsonp')
def obj_read_one(request):
return obj.read_one(request)
@view_config(route_name='obj_count', renderer='string')
def obj_count(request):
return obj.count(request)
@view_config(route_name='obj_create', renderer='jsonp')
def obj_create(request):
return obj.create(request)
@view_config(route_name='obj_update')
def obj_update(request):
return obj.update(request)
@view_config(route_name='obj_auto')
def obj_auto(request):
return obj.auto(request)
@view_config(route_name='obj_delete', renderer='jsonp')
def obj_delete(request):
return obj.delete(request)
在 <project>/__init__.py
from pyramid.renderers import JSONP
from c2c.sqlalchemy.rest import add_rest_routes
config.add_renderer('jsonp', JSONP(param_name='callback'))
add_rest_routes(config, 'obj', '/object')
控制显示的属性
可以通过将 attr_list 参数传递给构造函数来限制显示的属性为子集。默认情况下显示所有属性。例如
obj = REST(DBSession, Object, attr_list=['id', 'name'])
附加属性
可以在模型中定义一个带有 attr_list 参数的 __additional_properties__ 函数来添加一些额外的属性。例如
class Object(Base):
def __additional_properties__(self, attr_list=None):
properties = {}
if attr_list is None or 'l10n' in attr_list:
l10n = {}
for l in self.l10n:
l10n[l.lang.code] = l.value
properties.update({ "l10n": l10n })
return properties
使用关系
如果模型中定义了关系,并且它们被传递给REST构造函数,则可以使用 read_many 和 read_one 动作检索相关对象。例如
class Tag(GeoInterface, Base):
__tablename__ = 'tag'
__table_args__ = (
UniqueConstraint('name'),
{"schema": 'tagging'}
)
__acl__ = [
(Allow, 'admin', ALL_PERMISSIONS),
(Allow, 'editor', ('view', 'edit', 'new', 'delete')),
(Allow, Everyone, ('view')),
]
id = Column(types.Integer, primary_key=True)
name = Column(types.Unicode(200), nullable=False)
active = Column(types.Boolean, default=True)
l10n = relationship("TagL10n", backref="tag")
childrenTags = relationship("Tag",
secondary=tag_tag,
primaryjoin=id==tag_tag.c.tag_id1,
secondaryjoin=id==tag_tag.c.tag_id2,
order_by=name, backref="parentTags")
tag_children = {
'childrenTags': { 'rest': REST(DBSession, Tag) }
}
tag = REST(DBSession, Tag, children=tag_children)
可以使用 propname 参数指定包含相关对象的属性的名称(默认为关系名称)
tag_children = {
'childrenTags': { 'rest': REST(DBSession, Tag), 'propname': 'tags' }
}
tag = REST(DBSession, Tag, children=tag_children)
示例结果
{
"active": false,
"tags": [{
"active": true,
"name": "Artenschutz",
"id": 31
}, {
"active": false,
"name": "Pioniervegetation",
"id": 71
}],
"name": "Naturschutz",
"id": 58
}
来源
构建
python bootstrap.py --distribute -v 1.7.1 ./buildout/bin/buildout
协议
读取多个,GET 请求于 .../obj
{
"objects": [{
"id": id,
"property": "value",
...
},
...
]
}
读取一个,GET 请求于 .../obj/{id}
{
"id": id,
"property": "value",
...
}
计数,GET 请求于 .../obj/count
23
创建,POST 请求于 .../obj 并提供数据
{
"property": "value",
...
}
然后它将返回 ID。
更新,PUT 请求于 .../obj/{id} 并提供数据
{
"property": "value",
...
}
自动,POST 请求于 .../obj/auto 并提供数据
{
"id": id,
"property": "value",
...
}
如果对象与给定的 ID 匹配,它将被更新;否则,将自动创建一个新的对象,其 ID 值为给定值。
删除,DELETE 请求于 .../obj/{id}。
项目详情
关闭
c2c.sqlalchemy.rest-0.3.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7ee45bebf256cc29ba7612940c42f2761d46f686c59351ae02ad488dd3ff11ea |
|
MD5 | 1e89f53a9337dc64122a308700457d03 |
|
BLAKE2b-256 | 94767f50a5a47c183cff5f5e4eb530437c03e67ecf42f3c10f460257e97d8aba |