以下示例是伪金字塔应用程序。它显示了子包中的功能。
问题是config.load
和config.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
答案 0 :(得分:0)
这个问题已经自行消失了,而且我还没有能够创建一个小型的,独立的复制示例。
作为对可能遇到类似事情的其他人的暗示,请特别注意config.import
,config.scan
和config.make_wsgi_app
的顺序。这些陈述应按照我在此处列出的顺序显示在main
函数中。
这是我对问题根源的最佳猜测。