跳转到主要内容

cone.app的SQLAlchemy集成

项目描述

Latest PyPI version Number of PyPI downloads https://travis-ci.org/bluedynamics/cone.sql.svg?branch=master https://coveralls.io/repos/github/bluedynamics/cone.sql/badge.svg?branch=master

此包提供在 cone.app 中集成 SQLAlchemy 的功能,并为发布 SQLAlchemy 模型提供基本应用程序节点。

安装

cone.sql 包含在您的应用程序 setup.py 文件中,以安装依赖项。

配置数据库和WSGI

根据您的应用程序配置 ini 文件定义数据库位置,并将相关元素连接到 WSGI 管道。

[app:my_app]
use = egg:cone.app#main

pyramid.includes =
    pyramid_retry
    pyramid_tm

tm.commit_veto = pyramid_tm.default_commit_veto

cone.plugins =
    cone.sql

sql.db.url = sqlite:///%(here)s/var/sqlite/my_db.db

[filter:remote_addr]
# for use behind nginx
use = egg:cone.app#remote_addr

[filter:session]
use = egg:cone.sql#session

[pipeline:main]
pipeline =
    remote_addr
    session
    my_app

创建模型和节点

定义 SQLAlchemy 模型。

from cone.sql import SQLBase
from cone.sql.model import GUID
from sqlalchemy import Column
from sqlalchemy import String

class MyRecord(SQLBase):
    __tablename__ = 'my_table'
    uid_key = Column(GUID, primary_key=True)
    field = Column(String)

定义一个应用程序节点,该节点表示 SQL 行并使用 SQLAlchemy 模型。该类包含对相关 SQLAlchemy 模型的引用。

from cone.sql.model import SQLRowNode

class MyNode(SQLRowNode):
    record_class = MyRecord

定义一个应用程序节点,该节点表示表并作为 SQL 行节点的容器。该类包含对相关 SQLAlchemy 模型和相关 SQLRowNode 的引用。

from cone.sql.model import SQLTableNode

class MyContainer(SQLTableNode):
    record_class = MyRecord
    child_factory = MyNode

主键处理

节点名称映射到 SQLAlchemy 模型的主键(目前不支持多个主键)。节点名称会自动转换为主键数据类型。转换工厂在 SQLTableNode.data_type_converters 中定义,如果需要,可以扩展更多数据类型。

>>> SQLTableNode.data_type_converters
{<class 'sqlalchemy.sql.sqltypes.String'>: <type 'unicode'>,
<class 'cone.sql.model.GUID'>: <class 'uuid.UUID'>,
<class 'sqlalchemy.sql.sqltypes.Integer'>: <type 'int'>}

集成到应用程序模型

为了发布 SQL 表节点,该表节点必须连接到应用程序模型。要将其连接到根级别,请将其注册为条目。

import cone.app

cone.app.register_entry('container', MyContainer)

会话设置处理程序

存在一个 sql_session_setup 装饰器,可用于执行会话设置任务,如注册 SQLAlchemy 事件监听器。

from cone.sql import sql_session_setup
from sqlalchemy import event

def after_flush(session, flush_context):
    """Do something after flush.
    """

@sql_session_setup
def bind_session_listener(session):
    """SQL session setup callback.
    """
    event.listen(session, 'after_flush', after_flush)

查询数据库

数据库查询通过 SQLAlchemy 实现。如果您处于请求/响应周期中,应通过 get_session 从请求中获取会话并在其上执行任意操作。通过从请求中读取会话,我们确保如果配置了事务管理器,它可以正常工作。

from cone.sql import get_session

session = get_session(request)
result = session.query(MyRecord).all()

如果您需要在请求/响应周期之外使用会话,可以使用 session_factory 创建一个。

from cone.sql import session_factory

session = session_factory()
result = session.query(MyRecord).all()
session.close()

主要 ACL

基于 SQL 的主要 ACL 实现在 cone.sql.acl 中。相关表在从该模块导入时立即创建。

使用 SQLPrincipalACL 需要模型实现 node.interfaces.IUUID

from cone.sql.acl import SQLPrincipalACL
from node.base import BaseNode
from node.interfaces import IUUID
from plumber import plumbing
from pyramid.security import Allow
from zope.interface import implementer
import uuid as uuid_module

@implementer(IUUID)
@plumbing(SQLPrincipalACL)
class SQLPrincipalACLNode(BaseNode):
    uuid = uuid_module.UUID('1a82fa87-08d6-4e48-8bc2-97ee5a52726d')

    @property
    def __acl__(self):
        return [
            (Allow, 'role:editor', ['edit']),
            (Allow, 'role:manager', ['manage']),
        ]

用户和组管理

cone.sql.ugm 包含了在 node.ext.ugm.interfaces 中定义的 UGM 协议的实现,使用 SQL 作为后端存储。

                  +------------+
                  |  Principal |
                  |(data: JSON)|
                  +------------+
                        ^
                        |
   +-----------------------------------------+
   |                                         |
   |                                         |
+------+                                 +-------+
| User |                                 | Group |
+------+                                 +-------+
    1                                        1
    |                                        |
    |                                        |
    +-------------+            +-------------+
                  |            |
                  n            m
                  |            |
               +-----------------+
               | GroupAssignment |
               +-----------------+

目前支持并测试了 SQLite 和 PostgreSQL,其他数据库必须根据它们的 JSON 功能进行评估,因为用户和组在 JSON 字段中存储额外的有效负载数据,这带来了将任意数据作为字典存储在 JSON 字段中的灵活性。

要激活基于 SQL 的 UGM 后端,需要通过应用程序 ini 配置文件进行配置。

ugm.backend = sql

sql.user_attrs = id, mail, fullname, portrait
sql.group_attrs = description
sql.binary_attrs = portrait
sql.log_auth = True
sql.user_expires_attr = expires

UGM 用户和组存储在与配置文件中定义的 sql.db.url 相同的数据库中。

UGM 专用配置选项

  • sql.user_attrs 是一个用逗号分隔的字符串列表,定义了存储在用户 JSON 数据字段中的可用用户属性。

  • sql.group_attrs 是一个用逗号分隔的字符串列表,定义了存储在组 JSON 数据字段中的可用组属性。

  • sql.binary_attrs 是一个用逗号分隔的字符串列表,定义了被认为是二进制属性并在用户和组的 JSON 数据字段中以 base64 编码存储的属性。

  • sql.log_auth 默认为 False。如果设置,则将在第一次认证时存储第一次登录的时间戳,并且每次成功认证时都会更新最后一次登录的时间戳。

  • sql.user_expires_attr 默认为 None。如果设置,则启用用户过期,所给的值是 JSON 数据字段中存储过期时间戳的属性名称。

可以使用 cone.ugm 管理用户和组。如果激活,可以省略 sql.user_attrssql.group_attrs,相关信息将从 ugm.xml 配置文件中提取。

ugm.backend = sql
ugm.config = %(here)s/ugm.xml

sql.log_auth = True

cone.plugins =
    cone.ugm
    cone.sql

TODO

  • 支持多个主键。

贡献者

  • Robert Niederreiter(作者)

  • Phil Auersperg

更改

0.8 (2024-02-12)

  • SQLLayer.setUp 中调用超类 setUp 之前初始化 SQL,它本身调用 make_app。这确保了如果在 cone main_hook 中使用,sql.session_factory 可以正确设置。[rnix]

0.7 (2022-12-05)

  • cone.sql.ugm.UserBehavior 上实现 expiresexpired。通过 user_expires_attr 扩展 cone.sql.ugm.UgmBehavior,以启用用户过期支持。[rnix]

  • 添加 TestSQLSessionFactory 并在 SQLLayer.init_sql 中将其设置为 cone.sql.session_factory(如果不存在)。[rnix, toalba]

0.6 (2022-10-06)

  • 删除对 Nodespaces 行为的使用。[rnix]

  • IMappingStorage 替换已弃用的 IStorage 使用。[rnix]

  • MappingNode 替换已弃用的 Nodify 使用。[rnix]

  • 将已弃用的Adopt替换为MappingAdopt。[rnix]

  • 将已弃用的NodeChildValidate替换为MappingConstraints。[rnix]

  • 将已弃用的allow_non_node_children替换为child_constraints。[rnix]

0.5 (2021-11-08)

  • 将已弃用的SQLPrincipalRoles.allow_non_node_childs重命名为allow_non_node_children [rnix]

  • cache_ok添加到GUID类型装饰器中,以防止在使用SQLAlchemy 1.4时的警告。[rnix]

0.4 (2020-11-12)

  • 修复SqlUGMFactory.__init__中的拼写错误。[rnix]

0.3 (2020-07-09)

  • ini文件中的SQL数据库URL设置键从cone.sql.db.url更改为sql.db.url。[rnix]

  • 添加基于SQL的UGM实现。[zworkb, rnix]

  • 如果cone.sql.testing.SQLLayer中存在,则在cone.sql.session_factory上修补maker,以确保测试运行时工作会话工厂。[rnix]

0.2 (2020-05-30)

  • 引入cone.sql.SQLSessionFactory。在应用程序启动时作为单例在cone.sql.session_factory处实例化。[rnix]

  • ini文件中的SQL数据库URL设置键从cone.sql.dbinit.url更改为cone.sql.db.url。[rnix]

  • ini文件中app部分的SQL数据库URL定义只需一次。可以删除会话过滤器中的sqlalchemy.url。[rnix]

  • 添加基于SQL的主权ACL支持。[rnix]

  • Python 3兼容性。[rnix]

  • 修复cone.sql.model.GUID.process_bind_param中的十六进制格式错误。[rnix]

  • 使用zope.sqlalchemy.register将SQL会话注册到事务管理器。[rnix]

  • 使用pyramid_tm代替repoze.tm2。默认禁用,必须通过pyramid.includes显式启用。[rnix]

  • 使用pyramid_retry代替repoze.retry。默认禁用,必须通过pyramid.includes显式启用。[rnix]

  • 升级到cone.app 1.0b1。[rnix]

0.1 (2017-03-28)

  • 初始工作。[rnix]

许可证

版权(c)2017-2021,BlueDynamics Alliance,奥地利 版权(c)2021-2022,Cone贡献者。保留所有权利。

重新分发和使用源代码和二进制代码,无论是否修改,只要满足以下条件

  • 源代码重新分发必须保留上述版权声明、本许可列表和以下免责声明。

  • 二进制形式的重新分发必须在文档和/或其他随重新分发提供的材料中重新生产上述版权声明、本许可列表和以下免责声明。

本软件由版权所有者和贡献者提供“按原样”以及任何明示或暗示的保证,包括但不限于对适销性和适用于特定目的的暗示保证。在任何情况下,版权所有者或贡献者均不对任何直接、间接、偶然、特殊、示范性或后果性的损害(包括但不限于替代商品或服务的采购;使用、数据或利润的丧失;或业务中断)承担责任,无论这种损害是由于何种原因引起的,无论是在合同、严格责任还是侵权(包括疏忽或不计后果)的法律理论中,即使被告知了此类损害的可能性。

项目详情


下载文件

下载您平台对应的文件。如果您不确定选择哪一个,请了解更多关于 安装包 的信息。

源代码分发

cone.sql-0.8.tar.gz (29.9 kB 查看哈希值)

上传时间 源代码

构建分发

cone.sql-0.8-py3-none-any.whl (30.0 kB 查看哈希值)

上传时间 Python 3

由以下支持