我在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'}}
答案 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”。
也许修改一个样式现有端点,如下所示,看看你是否能够存储值并将它们保存在会话中:
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这是怎么回事。