在Django中,request.session不会被保存。

7

我有一个非常简单的实用函数,如果存在名为 'orderId' 的会话密钥,则获取打开的网络订单;如果没有会话密钥,并且函数中的参数 'createIfNotFound' 等于 true,则创建一个。通过调试器逐步执行代码时,我可以看到在创建订单后设置会话密钥的代码片段确实被执行了,没有出现异常,但当我检查 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默认阻止第三方cookie,禁用此功能似乎可以解决问题。 - dwlz
3个回答

19

很奇怪这个方法解决了问题,因为根据文档,OP的这种更改应该被检测为修改会话并触发保存,所以不需要显式设置.modified属性。无论如何,我遇到了类似的问题,如果这个方法也能解决我的问题,我会更新的。 - Danra

2
我曾经遇到过类似的问题,原来是我在settings.py中将SESSION_COOKIE_DOMAIN设置为了错误的域名,因此它不会保存任何新的会话数据。如果您正在使用SESSION_COOKIE_DOMAIN,请检查一下!例如,如果我在本地主机上运行服务器,但在我的设置中却有SESSION_COOKIE_DOMAIN = "notlocalhost",那么我对request.session所做的任何更改都将无法保存。

0
例如,在test()中的任何地方放置request.session.modified = True(默认为False)可以保存会话,如下所示。*只有在修改顶级键的数据时才会自动保存会话,您可以查看会话何时保存以及您可以查看我的问题我的答案来解释会话何时以及在哪里保存:
# "veiws.py"

from django.http import HttpResponse

def test(request):
    request.session.modified = True # Here
    return HttpResponse('Test')

或者,将settings.py中的SESSION_SAVE_EVERY_REQUEST设置为True,如下所示,也可以保存会话:
# "settings.py"

SESSION_SAVE_EVERY_REQUEST = True

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接