跳转到主要内容

为简单的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_manyread_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 (5.9 kB 查看哈希值)

上传时间

由以下提供支持