金字塔多次导入包导致问题

时间:2015-08-25 12:52:01

标签: python-3.x pyramid

以下示例是伪金字塔应用程序。它显示了子包中的功能。

问题是config.loadconfig.scan导致子包导入。这会导致重新定义模型对象 - 基本上重置它们。这意味着在提供请求时没有任何作用。

解决此问题的推荐方法是什么?

# /__init__.py
def main(global_config, **settings):
   config = Configurator(settings=settings)
   config.include('mypackage')     # This causes mypackage to load and 'RUNNING' to be printed
   ...
   config.scan()                   # This causes mypackage to load again, printing RUNNING and resetting WebSession object

# /mypackage/__init__.py

print('RUNNING')
WebSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))       

Base = declarative_base()
class WebPortalUser(Base):
    pass # pseudo-code


def do_dummy():
    s1 = WebSession()
    for i in s1.query(WebPortalUser):
        print(i)

def includeme(config):
    settings = config.registry.settings
    engine = engine_from_config(settings, 'sqlalchemy.')
    WebSession.configure(bind=engine)
    do_dummy()         # This works

@view_config(route_name='test')
def test(request):
    do_dummy()     # Raises sqlalchemy.exc.UnboundExecutionError: Could not locate a bind configured on mapper Mapper|WebPortalUser|webportal_user, SQL expression or this Session

1 个答案:

答案 0 :(得分:0)

这个问题已经自行消失了,而且我还没有能够创建一个小型的,独立的复制示例。

作为对可能遇到类似事情的其他人的暗示,请特别注意config.importconfig.scanconfig.make_wsgi_app的顺序。这些陈述应按照我在此处列出的顺序显示在main函数中。

这是我对问题根源的最佳猜测。