2015-02-04 199 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