代码之家  ›  专栏  ›  技术社区  ›  Avi Kaminetzky

存储在Django会话中

  •  3
  • Avi Kaminetzky  · 技术社区  · 8 年前

    我在django模板中有一个reactjs组件,用户单击一个签出按钮,发布 item_code 并被重定向到签出:

    onCheckout = () => {
        fetch("/onCheckout/", {
            method: "POST",
            body: JSON.stringify({'item': this.props.item_info.code})
          }).then(window.location.replace("/checkout"))
    }
    

    Django视图接收请求并将其存储在会话中。

    def onCheckout(request):
        if request.method == "POST":
            items = request.session.get('items', [])
            new_item = json.loads(request.body.decode('utf-8'))['item']
            items.append(new_item)
            request.session['items'] = items
    

    我在会话中存储数据时遇到问题。当第一个项正确存储在数组中,然后我签出第二个项后, items 阵列开始工作:

    (Pdb) items
    ['15130BC.ZZ.8042BC.01']
    (Pdb) new_item
    '5213G-001'
    (Pdb) items
    ['15130BC.ZZ.8042BC.01']
    (Pdb) items
    ['5213G-001']
    

    如果我试图进入 request.session['item'] 从其他任何视图函数中,我都会得到一个keyError。

    我对姜戈还比较陌生,任何帮助都会很感激。此外,我想知道是否有更好的选择来完成上述工作。

    会话配置

    settings.SESSION_ENGINE = 'django.contrib.sessions.backends.db'
    settings.SESSION_CACHE_ALIAS = 'default'
    settings.CACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'}}
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   rtindru    8 年前

    一些关于Django会话更改检测的阅读: https://docs.djangoproject.com/en/2.0/topics/http/sessions/#when-sessions-are-saved

    根据您的代码,我觉得应该进行更改检测。但是,让我们尝试强行执行此操作,您可以添加以下行作为代码的最后一行吗? request.session.modified = True -看看这是否解决了你的问题?

    更新:一些基本检查

    你能查证一下吗

    检查数据库后端是否已配置为priestly

    如果要使用数据库支持的会话,则需要将“django.contrib.sessions”添加到已安装的“appssetting”。配置好安装后,runmanage.py migrateto安装存储会话数据的单个数据库表。

    检查会话中间件是否已启用

    会话通过中间件实现。由_django admin startproject_创建的默认_settings.py_已激活_session middleware_。_要启用会话功能,请编辑_middleware_classes_设置并确保它包含__'django.contrib.sessions.middleware.sessionmiddleware'。

    更新2:测试会话

    可以按如下方式修改样式现有端点,并查看是否能够存储值并在会话中持久化这些值:

    test_keys = request.session.get('test_keys', [])
    test_keys.append(random.randint())
    request.session['test_keys'] = test_keys
    return Response(request.session.get('test_keys', [])) 
    

    您应该看到,每次访问API时,除了所有过去的值之外,还会得到一个包含一个新整数的列表。我知道这是怎么回事。