存储在Django Sessions中

时间:2018-05-23 17:45:25

标签: django reactjs

我在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。

我对Django很新,任何帮助都会受到赞赏。此外,我想知道是否有更好的替代方案来实现上述目标。

会话配置

settings.SESSION_ENGINE = 'django.contrib.sessions.backends.db'
settings.SESSION_CACHE_ALIAS = 'default'
settings.CACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'}}

1 个答案:

答案 0 :(得分:1)

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

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

更新:一些基本检查

您可以验证以下

检查db后端是否配置为priestly

  

如果要使用数据库支持的会话,则需要将“django.contrib.sessions”添加到INSTALLED_APPS设置中。配置安装后,运行manage.py migrate以安装存储会话数据的单个数据库表。

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

  

会话通过一个中间件实现。由django-admin startproject创建的默认settings.py已激活SessionMiddleware。要启用会话功能,请编辑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时,除了所有过去的值之外,你会得到一个包含一个新整数的列表。 Lmk这是怎么回事。