3

我正在尝试学习 Pyramid 并且在让消息闪烁工作时遇到问题。我是全新的,但阅读了文档并完成了教程。

我完成了有关创建 wiki 的教程(此处为教程,此处为代码)。它工作得很好而且非常简单,所以我决定尝试应用我在我做的待办事项列表教程中看到的 flash 消息(教程在这里,完整代码在页面底部的单个文件中)。基本上,当创建待办事项列表时,页面会刷新并显示一条消息“新任务已成功添加!”。每当有人在 wiki 教程中更新 wiki 文章时,我都想这样做。

所以我重新阅读了文档中的会话部分,它说我真的只需要这样做:

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!')但我每次都会收到错误:金字塔错误: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 示例中有几个文件。我在 view.py 文件中添加了会话导入,因为flash 消息是由视图本身生成的)。

我究竟做错了什么?有什么建议么?

4

1 回答 1

6

您提供的代码只是一个示例,当然您需要在正确的地方应用它。在 Pyramid 中,您应该(在简单的情况下;)在您的代码中只有 1 个位置创建 1 个Configurator实例,在教程中它位于 main 函数中。AConfigurator自己不做任何事情,除了用make_wsgi_app.

因此,要在那里添加会话,修改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)
    ...
于 2012-06-25T05:34:49.833 回答