【问题标题】:Django - request.session not being savedDjango - request.session 没有被保存
【发布时间】:2017-01-20 07:19:05
【问题描述】:

我有一个非常简单的实用函数,如果它们是一个名为“orderId”的会话密钥,它会获取一个打开的网络订单,如果没有会话密钥,它将创建一个,并且参数“createIfNotFound”在功能。用我的调试器单步执行它,我可以看到在创建订单后设置会话密钥的那段代码确实会毫无例外地被命中,但是当我检查 Http 请求对象的会话字段时,它没有该属性?

实用程序

def get_open_web_order(request, createIfNotFound=False):
    # Check for orderId in session
    order_id = request.session.get('orderId')
    web_order = None

    if None != order_id:
        try:
            web_order = WebOrder.objects.get(id=order_id, status='O')
            logging.info('Found open web order')
        except WebOrder.DoesNotExist:
            logging.info('Web order not found')

    if (None == web_order) and (createIfNotFound == True):
        logging.info('Creating new web order')

        web_order = WebOrder()
        web_order.status = 'O'

        web_order.save()
        request.session['orderId'] = web_order.id

        # Assign logged in user and default billing and shipping
        if request.user.is_authenticated() and hasattr(request.user, 'customer'):
            customer = request.user.customer
            web_order.customer = customer
            web_order.set_defaults_from_customer()
            web_order.save()

    return web_order

【问题讨论】:

  • 嵌入式 Shopify 应用程序发生在我身上。 Safari 默认会阻止 3rd 方 cookie,禁用此功能似乎可以解决问题。

标签: python django session view


【解决方案1】:

在某些情况下,您需要明确告诉会话它已被修改。

您可以在更改session 中的某些内容后,将request.session.modified = True 添加到您的视图中

您可以在此处阅读更多信息 - https://docs.djangoproject.com/en/1.10/topics/http/sessions/#when-sessions-are-saved

【讨论】:

  • 很好奇这解决了这个问题,因为根据文档,应该将这种更改 OP 检测为会话修改并触发保存,因此不应明确设置 .modified 属性被需要。无论如何,我遇到了类似的问题,如果这也解决了我的问题,我会更新。
【解决方案2】:

我有一个类似的问题,原来我在 settings.py 中将 SESSION_COOKIE_DOMAIN 设置为不正确的域,因此它不会保存任何会话数据。如果您使用的是 SESSION_COOKIE_DOMAIN,请尝试检查。

【讨论】:

  • 非常感谢,由于某种原因,我的开发设置文件中启用了此设置
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 2012-02-16
  • 2016-05-17
  • 1970-01-01
相关资源
最近更新 更多