如何在Django中通过注销/重新登录来保存和恢复会话数据?

问题描述 投票:0回答:2

我正在建立一个学习网站,该网站存储有关用户进度的各种数据。目前,我正在使用会话来执行此操作。我想要以下行为:

  1. 未注册用户可以稍后返回该站点,该站点将记住他们的进度。
  2. [用户创建帐户时,他们不会丢失任何有关已收集进度的数据。
  3. 注册用户注销后,其进度应被隐藏。
  4. 注册用户重新登录后,应恢复其进度。

会话对于行为1-3非常有用,但是在步骤4中,进度无法恢复。如果我了解Django如何正确处理会话,那么当用户注销时,所有会话数据都会被销毁。用户重新登录后,保存此数据并再次还原的最佳方法是什么?

django
2个回答
2
投票

似乎没有最好的方法来做到这一点,但是我想出的解决方案效果很好,所以我想我会分享的。

我创建了一个单独的表,用于永久存储注册用户的键/值对。理想情况下,您可能希望将数据存储为序列化的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()

0
投票

@@ John Meinken,我遇到了同样的问题:How can save session of shopping cart data after logout, so the user can find them when login again in Django?

您的解决方案可能会解决我的问题,但是,请您为我进一步解释一下,我应该在哪里创建此表?我应该在哪里使用此功能?例如我的项目包含许多应用程序(帐户,商店,购物车,订单)

提前感谢。

© www.soinside.com 2019 - 2024. All rights reserved.