【问题标题】:Where to initialize Django session variables?在哪里初始化 Django 会话变量?
【发布时间】:2011-05-29 15:49:15
【问题描述】:

在我的 Django 项目中,我正在构建一个购物车系统。我想将购物车数据存储在会话变量中,但我不知道在哪里初始化它。

我尝试过这样做:

if 'cart' not in request.session:
    request.session['cart'] = {}

在自定义上下文处理器中,但上下文处理器似乎不会修改会话数据。我还能在哪里进行这样的初始化?我不想把它放在我从购物车中获取价值的每个地方。

【问题讨论】:

  • 上下文处理器将仅针对使用 RequestContext 呈现的模板触发。您确定要传递 RequestContext 而不是简单的 dict 或 Context 对象吗?这对我有用。
  • 这让我很困惑,因为是的,我确保我传递了一个 RequestContext。事实上,上下文处理器中的其他代码正在运行,但初始化代码却没有。也许我错过了别的东西。无论如何,其他两种解决方案都有效,所以我将使用其中一种。

标签: python django session


【解决方案1】:

您可以将其放在custom request middleware 的一部分中,但老实说,我认为这有点矫枉过正。当您在视图函数中需要它时,只初始化购物车可能更容易。请注意,如果默认值不存在,您可以使用request.session.get 自动获取默认值。比如:

def my_view(request):
    cart = request.session.get('cart', {})
    # Do stuff with cart
    request.session['cart'] = cart

【讨论】:

    【解决方案2】:

    在中间件中执行此操作(显然是在会话中间件下方)将确保它始终处于设置状态。

    【讨论】:

    • 这显然很有帮助。
    【解决方案3】:

    假设您的视图始终使用 RequestContext,您的代码应该按原样与 context_processor 一起工作。

    根据几年前的 Satchmo,我正在为我的购物车做同样的事情。 我有一个 context_processor,我可以在其中从会话中找到购物车并将其传递给模板。 许多其他会话修改也在那里完成......

    所以.. 您的代码应该可以正常工作。它在执行吗?安装了吗?

    【讨论】:

      【解决方案4】:

      为什么需要测试购物车是否在 request.session 中。为什么不这样做:

      cart_value = request.session.get('cart',{})
      

      基本上,这将在会话中返回“购物车”的值,如果购物车中没有值,则返回空字典。

      【讨论】:

        猜你喜欢
        • 2023-01-20
        • 2020-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多