我正在尝试学习金字塔,并且在使消息闪存工作时遇到问题。我是全新的,但阅读文档并完成教程。
我做了关于创建wiki的教程(tutorial here,Code here)。它工作得很好而且非常简单所以我决定尝试应用我在todo list教程中看到的flash消息(tutorial here,完整代码在页面底部的单个文件中)。基本上,当创建待办事项列表时,将刷新页面并显示“已成功添加新任务!”的消息。每当有人在维基教程中更新维基文章时,我都想这样做。
所以我重新阅读了文档中的会话部分,它说我真的需要这样做:
from pyramid.session import UnencryptedCookieSessionFactoryConfig
my_session_factory = UnencryptedCookieSessionFactoryConfig('itsaseekreet')
from pyramid.config import Configurator
config = Configurator(session_factory = my_session_factory)
然后在我的代码中我需要添加:request.session.flash('New wiki was successfully added!')
但每次都会出错:Pyramid错误:AttributeError:没有会话工厂注册
这是我的函数(除了request.session.flash部分之外,它与教程完全相同):
@view_config(route_name='edit_page', renderer='templates/edit.pt', permission='edit')
def edit_page(request):
name = request.matchdict['pagename']
page = DBSession.query(Page).filter_by(name=name).one()
if 'form.submitted' in request.params:
page.data = request.params['body']
DBSession.add(page)
request.session.flash('page was successfully edited!')
return HTTPFound(location = request.route_url('view_page',
pagename=name))
return dict(
page=page,
save_url = request.route_url('edit_page', pagename=name),
logged_in=authenticated_userid(request),
)
(注意:我认为我可能做错的一件事是在todo示例中,所有数据都在一个文件中,但在wiki示例中有几个文件..我在视图中添加了我的会话导入。 py文件,因为flash消息是由视图本身生成的。)
我做错了什么?有什么建议吗?
答案 0 :(得分:6)
您提供的代码只是一个示例,当然您需要在正确的位置应用它。在Pyramid中,您应该(在简单的情况下;)在您的代码中只有1个位置,您只创建1个Configurator
实例,在教程中它位于main函数中。 Configurator
除了使用make_wsgi_app
创建WSGI应用程序外,不会自行执行任何操作。
因此,要在那里添加会话,请按如下所示修改wiki2/src/views/tutorial/__init__.py
:
from pyramid.config import Configurator
from sqlalchemy import engine_from_config
from pyramid.session import UnencryptedCookieSessionFactoryConfig
from .models import DBSession
def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
engine = engine_from_config(settings, 'sqlalchemy.')
DBSession.configure(bind=engine)
my_session_factory = UnencryptedCookieSessionFactoryConfig('itsaseekreet')
config = Configurator(settings=settings, session_factory=my_session_factory)
...