17:临时数据使用会话

在Pyramid会话中存储和检索非永久数据。

背景

当人们使用您的Web应用程序时,他们经常执行需要保存半永久数据的任务。例如,购物车。这叫A session .

Pyramid对会话有基本的内置支持。第三方软件包,如 pyramid_redis_sessions 提供更丰富的会话支持。或者您可以创建自己的自定义会话引擎。让我们看看 built-in sessioning support .

目标

  • 使用内置的简单Pyramid会话系统创建会话工厂。

  • 更改代码以使用会话。

步骤

  1. 首先我们复制 view_classes 步骤:

    cd ..; cp -r view_classes sessions; cd sessions
    $VENV/bin/pip install -e .
    
  2. 我们的 sessions/tutorial/__init__.py 需要选择会话工厂才能注册到 configurator

     1from pyramid.config import Configurator
     2from pyramid.session import SignedCookieSessionFactory
     3
     4
     5def main(global_config, **settings):
     6    my_session_factory = SignedCookieSessionFactory(
     7        'itsaseekreet')
     8    config = Configurator(settings=settings,
     9                          session_factory=my_session_factory)
    10    config.include('pyramid_chameleon')
    11    config.add_route('home', '/')
    12    config.add_route('hello', '/howdy')
    13    config.scan('.views')
    14    return config.make_wsgi_app()
    
  3. 我们的观点 sessions/tutorial/views.py 现在可以使用 request.session

     1from pyramid.view import (
     2    view_config,
     3    view_defaults
     4    )
     5
     6
     7@view_defaults(renderer='home.pt')
     8class TutorialViews:
     9    def __init__(self, request):
    10        self.request = request
    11
    12    @property
    13    def counter(self):
    14        session = self.request.session
    15        if 'counter' in session:
    16            session['counter'] += 1
    17        else:
    18            session['counter'] = 1
    19
    20        return session['counter']
    21
    22
    23    @view_config(route_name='home')
    24    def home(self):
    25        return {'name': 'Home View'}
    26
    27    @view_config(route_name='hello')
    28    def hello(self):
    29        return {'name': 'Hello View'}
    
  4. 模板在 sessions/tutorial/home.pt 可以显示值:

     1<!DOCTYPE html>
     2<html lang="en">
     3<head>
     4    <title>Quick Tutorial: ${name}</title>
     5</head>
     6<body>
     7<h1>Hi ${name}</h1>
     8<p>Count: ${view.counter}</p>
     9</body>
    10</html>
    
  5. 确保测试仍然通过:

    $VENV/bin/pytest tutorial/tests.py -q
    ....
    4 passed in 0.42 seconds
    
  6. 运行 Pyramid 应用程序时使用:

    $VENV/bin/pserve development.ini --reload
    
  7. 在浏览器中打开http://localhost:6543/和http://localhost:6543/howdy。当您在这些URL之间重新加载和切换时,请注意计数器会增加,并且 not 特定于URL。

  8. 重新启动应用程序并重新访问页面。注意,计数器仍然会从停止的位置增加。

分析

Pyramid request 对象现在有一个 session 可以在视图代码中使用的属性。它就像一本字典。

因为所有视图都使用同一个计数器,所以我们在视图类级别将计数器设置为python属性。这样,每次重新加载都会增加模板中显示的计数器。

在Web开发中,“flash messages”是用户在未来的Web请求之后需要出现在屏幕上的注释。例如,当使用窗体添加项时 POST ,网站通常会发出第二个HTTP重定向Web请求以查看新项目。您可能希望在第二个Web请求后出现一条消息,说明“您的项目已添加”。您不能将其返回到日志的Web响应中,因为它将在第二个Web请求期间被丢弃。

flash消息是一种技术,消息可以在请求之间存储,使用会话,然后在最终显示时删除。