后端不可知的数据建模实体库

springfield的Python项目详细描述


Build Status

springfield使api数据变得简单。

springfield简化了结构化数据的建模。一旦数据是 经过建模,springfield可以将api响应解析为易于使用的python对象 和类型。它还可以生成相同的结构化数据来生成api 请求。

斯普林菲尔德非常适合:

  • restful json api数据结构
  • 分析来自csv.DictReader
  • 的csv数据结构
  • 将python可以解析的任何内容转换为dictlist转换为 结构化对象

还有一个用于在mongo中使用springfield的助手库:springfield- mongo

快速启动

要定义springfield.Entity,子类 springfield.Entity。通过指定 fields。此库提供以下自描述字段 从:

  • IntField
  • FloatField
  • BooleanField
  • StringField
  • BytesField
  • DateTimeField
  • EmailField
  • UrlField
  • EntityField
  • CollectionField

一个简单的例子:

#!/usr/bin/env python
from springfield import Entity, fields
from springfield.timeutil import utcnow


class Bookmark(Entity):
    uri = fields.UrlField(doc='The bookmark uri.')
    verified = fields.BooleanField(doc='Whether or not this bookmark URI has been verified to exist.')
    added = fields.DateTimeField()


class User(Entity):
    id = fields.IntField(doc='Auto-incremented database id.')
    email = fields.EmailField(doc='The user\'s email address.')
    bookmarks = fields.CollectionField(fields.EntityField(Bookmark))
    created = fields.DateTimeField()


if __name__ == '__main__':
    user = User()
    user.id = 5
    user.email = 'foobar@example.com'
    user.bookmarks = [
        {'uri': 'https://github.com'},
        {'uri': 'ftp://google.com', 'verified': True}
    ]
    user.created = utcnow()
    data = user.to_json()
    # `data` is suitable to return in something like a JSON API.
    print data

    # Similarly, `data` can be adapted from a JSON API request body.
    user = User.from_json(data)
    print user.email
    print user.created
    print user.bookmarks

将打印(json被美化以保护无辜者):

{
    "bookmarks":[
        {
            "uri":"https://github.com"
        },
        {
            "uri":"ftp://google.com",
            "verified":true
        }
    ],
    "created":"2017-01-25T20:25:54Z",
    "email":"foobar@example.com",
    "id":5
}
foobar@example.com
2017-01-25 20:47:37+00:00
[<Bookmark {uri: https://github.com}>, <Bookmark {verified: True, uri: ftp://google.com}>]

注意以下几点:

  • 并非每个字段都是实体所必需的。这对于稀疏 API的更新。
  • springfield将以非破坏性的方式调整类型。
  • 您还可以通过调整json来创建实体,这在api中非常方便 边界。

现场验证

springfield在构造实体时进行字段验证,根据 由该实体上的字段定义的类型。例如:

可以通过子类化定义更复杂的字段适应行为。 springfield.fields.Field并实现自己的字段。见 有关springfield.fields.Field的文档了解更多 信息。

建筑文档

要生成文档,请首先安装要求:

现在您可以使用make

运行测试

要运行测试,请首先安装测试要求:

pip install -r test_requirements.txt

测试可以使用./src/tests/runtests.py:

python src/tests/runtests.py

变更日志

0.8.0

  • 增加了对Python3.6+的支持
  • 放弃对python<;2.7的支持

0.7.17

  • 修复pytest插件的包

0.7.16

  • 允许EntityFields使用点式名称类字符串。这样做是为了允许实体中的循环引用可以相互引用。
  • 添加bytesfield

0.7.15

错误修复

  • 允许url为空值

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java文件分块,获取长度字节   java嵌入式Tomcat不执行jsf页面   java我的数据库中有2个实体,但hibernate返回其中6个。   java如何基于逗号拆分字符串   java取消已经运行的CompletableFutures的预期模式是什么   java如何在informix中从另一个数据库复制表ddl和数据   为什么图片是黑色的?   java根据字符串数组中的单词筛选列表   Java8的集合。平行流有效吗?   Kotlin中的java静态内部类   java如何在GUI中生成一列字符串   javafx如何正确使用高对比度主题?   带空格的javascript Httpurlconnection参数   java如何设置GridBagLayout的约束   java如何在一个线程可能尚未初始化时关闭另一个线程   java将简单时间格式转换为特殊时间格式(hhmmt)   安卓/java阵列重复过滤器的问题   java在队列的链接实现下,入队和出队是如何工作的   java更新sql外键约束