金字塔框架包括模型.py从插件到主应用程序

2024-04-24 08:07:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个金字塔框架认证插件。插件需要有一个存储用户登录和其他数据的数据库,因此如果用户使用我的插件,他的数据库必须包含来自插件的某些表/模型。e、 g此用户表

class User(Base):
    __tablename__ = 'User'
    id = Column(Integer, primary_key=True)
    username = Column(Text())
    user_firstname = Column(Text())
    user_lastname = Column(Text())
    user_email = Column(Text())
    user_password = Column(Text())
    user_registrationdate = Column(DateTime())
    user_email_key = Column(Text())
    user_email_key_date_created = Column(DateTime())
    user_email_approved = Column(Boolean())
    user_email_sent = Column(Boolean())
    user_active_account = Column(Boolean())
    user_banned = Column(Boolean())
    user_banned_reason = Column(Text())

我需要这个模型包括在用户主应用程序,我猜我必须包括一些东西在我的includeme下面显示

^{pr2}$

但我不知道该怎么办。有没有一种方法可以将我的外接程序中的Base和DBSession合并到主应用程序中的Base,这样,如果用户运行../bin/initialize_myapp_db,myaddon和主应用程序中的表都会被创建?在


Tags: keytext用户模型插件数据库应用程序base
2条回答

我自己也有同样的问题。我仍在努力让我的东西更易插拔,但结果喜忧参半。我解决这个问题的方法是用同一个引擎绑定每个声明性基类。在我的通用scaffolding中,我这样做:

# create db engine
engine = engine_from_config(settings, 'sqlalchemy.')
# setup db.sessionmaker
settings['db.sessionmaker'] = DBSession
# bind session to engine
DBSession.configure(bind=engine)
# bind objects to engine
Base.metadata.bind = engine
from trumpet.models.base import Base as TrumpetBase
TrumpetBase.metadata.bind = engine
if settings.get('db.populate', 'False') == 'True':
    from mslemon.models.main import make_test_data
    import mslemon.models.misslemon
    Base.metadata.create_all(engine)
    TrumpetBase.metadata.create_all(engine)
    #initialize_sql(engine)

您可以使用以下方法:

import sqlalchemy
import sqlalchemy.orm as orm
from zope.sqlalchemy import ZopeTransactionExtension
from sqlalchemy.ext.declarative import declarative_base

DBSession = None

def get_sa_base(engine):
    sabase = sqlalchemy.ext.declarative.declarative_base()
    sabase.metadata.reflect(engine)
    return sabase

def includeme(config):
    global DBSession
    engine = sqlalchemy.engine_from_config(config.registry.settings)
    if DBSession is None:
        DBSession = orm.scoped_session(
            orm.sessionmaker(extension=ZopeTransactionExtension()))
    DBSession.remove()
    DBSession.configure(bind=engine)
    Base = get_sa_base(engine)

    # example:
    Base.metadata.tables.values()

可以找到一个例子here。在

相关问题 更多 >