2015-02-04 195 views
0
添加request.authenticated_userid到SQLAlchemy的对象

我使用“版本历史记录表”,这里所描述的SQLAlchemy混入:http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.versioned_history金字塔

它可以很好地补充道“改为”一栏历史记录表格,记录变化的时间戳但我还需要记录谁更改了记录(审计跟踪)

如果您使用金字塔中可用的典型身份验证和授权子系统,通常在request.authenticated_userid中可用的金字塔。

太好了。但是如何让历史映射器(mixin的一部分)利用这个值呢?

也就是说,除了changed列,我希望在_history表中有changed_byrequest.authenticated_userid)列。最好不用手动将其添加到历史表记录。

回答

0

我计算出溶液:

history_meta.py包含被登记before_flush SQLAlchemy的事件(在一个混合定义versioned_sessioncreate_version功能。

create_version一个具有获取当前的交易:

current = transaction.get() 

用户在current.user可用。

0

我不是SQLAlchemy的专家,但是我不使用主塔金字塔SLQAlchemy,这就是我如何从我的事件访问用户ID(下面是只是为了显示这个想法):

from sqlalchemy.ext.declarative import declarative_base 

from sqlalchemy.orm import (
    scoped_session, 
    sessionmaker, 
    ) 

from zope.sqlalchemy import ZopeTransactionExtension 
from pyramid.threadlocal import get_current_request 

DBSession = scoped_session(
    sessionmaker(extension=ZopeTransactionExtension()), 
    scopefunc=get_current_request) 

Base = declarative_base() 

# Define your tables 

@event.listens_for(Base, "after_insert", propagate=True) 
def user_after_insert(mapper, connection, target): 
    try: 
     user_id = DBSession.registry.scopefunc().userid 
    except AttributeError: 
     # most likely initializedb script is being called