在Django中存储访客选择

时间:2011-07-08 23:21:01

标签: django cookies

我有一个Django网站,基本上只显示一堆项目 来自具有搜索,过滤等的数据库。该网站是公开的 访问,没有登录或任何东西。我想做的是第一个 用户访问网站的时间,提示他们选择过滤器,然后 保存那个过滤器选择(在他们的机器上将是更好的,将是一个 浏览器cookie在这里工作?)以便将来每次访问它们 网站,它与过滤器一起显示。

所以我在这里有两个具体问题:

1)存储他们选择的最佳方式是什么?

2)收集他们选择的最佳方式是什么?我的方式 设想这种行为是他们第一次访问该网站, 它们呈现出各种各样的“弹出式”,基本上是要求的 他们的过滤器选择,继续到他们的主站点页面 过滤器选择已启用我遇到的问题是过滤器 他们选择的选项会更改将显示的内容 网站。我有没有办法避免重新加载整个页面 有他们的过滤器选择吗?

这是一个像我正在尝试的弹出窗口这样的例子 创建:http://www.wizards.com/wpn/events/rules.aspx

谢谢, -Alexei

1 个答案:

答案 0 :(得分:1)

给用户一个cookie肯定会有用。在Web开发中,该技术被称为为用户创建“会话”,以便每次他们从您的站点请求页面时,该请求都可以被识别为该特定会话的一部分并相应地进行服务。

Django提供了一个优秀且易于使用的会话框架。您应该阅读文档here,但我将总结您需要采取的步骤。

  1. 启用Django会话中间件(这已在默认的Django项目中完成)。确保django.contrib.sessions.middleware.SessionMiddleware位于设置文件中的MIDDLEWARE_CLASSES变量中。
  2. 选择会话后端。数据库会话将开始运行良好(如果以后性能成为问题,请考虑使用Memcached提供存储的缓存会话)。
  3. 设置符合您要求的合适SESSION_COOKIE_AGE。如果您希望用户的选择持续很长时间,您可以将此数字设置得非常高。
  4. 完成此操作后,传递到视图中的request变量将具有session属性。 session是一个对象,您可以像字典一样使用它来存储信息。神奇的一点是,对于向您的网站发出请求的每个用户,该信息都是唯一的。

    此部分代码演示了如何根据存储在其会话中的先前选择的用户选择返回内容:

    def get_front_page_contents(request):
        filter = request.session.get('filter_choice', False)
        if filter:
            # do the filtering 
            render_to_response(template_name,
                {'filtered_content': content},
                RequestContext(request))
        else:
            # the user has not made a choice so
            # return a default result set or redirect 
            # to form that allows them to make a choice
    

    你的第二个问题是如何首先收集这个选择。这是一个使用多页加载的简单解决方案。

    1. 在初始请求主页时,检查request.session是否为该用户保存了选项。
      • 如果有,请渲染包含已过滤内容的页面(并且您已完成)。
      • 如果没有,请重定向到可以做出选择的表单。
    2. 在表单提交时,将选项存储在request.session中以供此用户使用。返回他们想要的内容。
    3. 在此过程之后,当同一用户稍后返回第一步时,将显示他们想要的内容。

      避免页面重新加载是一个单独的问题,但可以使用javascript和AJAX技术轻松完成。你可能想要提供一个包含javascript的最小页面来提出内容请求。可以用完全相同的方式检查这些AJAX请求,以检查是否存在会话数据。