我正在建立一个学习网站,该网站存储有关用户进度的各种数据。目前,我正在使用会话来执行此操作。我想要以下行为:
会话对于行为1-3非常有用,但是在步骤4中,进度无法恢复。如果我了解Django如何正确处理会话,那么当用户注销时,所有会话数据都会被销毁。用户重新登录后,保存此数据并再次还原的最佳方法是什么?
似乎没有最好的方法来做到这一点,但是我想出的解决方案效果很好,所以我想我会分享的。
我创建了一个单独的表,用于永久存储注册用户的键/值对。理想情况下,您可能希望将数据存储为序列化的JSON,类似于django_sesssion表的工作方式,但是简单的字符字段也可以工作:
class account_data(models.Model):
username = models.CharField(max_length=30)
key = models.CharField(max_length=30)
value = models.CharField(max_length=30, null=True, blank=True)
class Meta:
unique_together = ("username", "key")
每次我要保存或检索键值对时,我都会检查用户是否登录。如果不是,则将数据保存到会话中。如果是这样,我将数据保存到account_data表中。我构建了一些函数来处理此问题:
from account_manager.models import account_data
def getSessionOrAccountData(request, key):
if request.user.is_authenticated():
username = request.user.username
try:
record = account_data.objects.get(username=username, key=key)
return record.value
except:
return None
else:
if key in request.session.keys():
return request.session[key]
else:
return None
def setSessionOrAccountData(request, key, value):
if request.user.is_authenticated():
username = request.user.username
try:
record = account_data.objects.get(username=username, key=key)
record.value = value
record.save()
except account_data.DoesNotExist:
record = account_data(username=username, key=key, value=str(value))
record.save()
else:
request.session[key] = value
def deleteSessionOrAccountData(request, key):
if request.user.is_authenticated():
username = request.user.username
account_data.objects.filter(username=username).filter(key=key).delete()
else:
del request.session[key]
最后,当用户创建一个新帐户时,我想将他们可能拥有的所有会话数据复制到account_data表中。创建新用户帐户后,将立即运行以下代码:
# save all existing session data to new user account
for key in request.session.keys():
record = account_data(username=request.POST['username'],
key=key,
value=str(request.session[key]))
record.save()
@@ John Meinken,我遇到了同样的问题:How can save session of shopping cart data after logout, so the user can find them when login again in Django?
您的解决方案可能会解决我的问题,但是,请您为我进一步解释一下,我应该在哪里创建此表?我应该在哪里使用此功能?例如我的项目包含许多应用程序(帐户,商店,购物车,订单)
提前感谢。