为匿名用户提供与注册用户相同的功能
Posted
技术标签:
【中文标题】为匿名用户提供与注册用户相同的功能【英文标题】:Giving anonymous users the same functionality as registered ones 【发布时间】:2010-10-29 20:30:33 【问题描述】:我正在使用 Django 开发一个在线商店(现在只是一个基本的购物车),并且我计划为用户添加将商品标记为收藏的功能(就像在 *** 中一样)。购物车的模型如下所示:
class Cart(models.Model):
user = models.OneToOneField(User)
class CartItem(models.Model):
cart = models.ForeignKey(Cart)
product = models.ForeignKey(Product, verbose_name="produs")
收藏夹模型只是一个包含两行的表格:用户和产品。
问题是这仅适用于注册用户,因为我需要一个用户对象。我怎样才能让未注册的用户使用这些功能,将数据保存在 cookie/会话中,以及他们何时以及如果他们决定注册,将数据转移给他们的用户?
我想一种选择是某种泛型关系,但我认为这有点复杂。可能在 user 之后有一个额外的行,这是一个会话对象(直到现在我还没有真正在 django 中使用过会话),如果 User 设置为 None,使用它吗?
所以基本上,我想问的是,如果您以前遇到过这个问题,您是如何解决的,最好的方法是什么?
【问题讨论】:
【参考方案1】:我认为您在考虑使用会话时走在正确的轨道上。我会在用户会话中存储一个产品 ID 列表,然后当用户注册时,按照您的定义创建一个购物车,然后添加项目。查看session docs。
您可以允许未登录或没有帐户的人将商品添加到“临时”购物车。当此人登录任一帐户或创建新帐户时,将这些物品添加到他们的“真实”购物车中。然后,只需在“将商品添加到购物车”和登录功能中添加几行代码,即可使用现有模型。
【讨论】:
【参考方案2】:在我看来,最简单的方法是存储用户 ID 或会话 ID:
class Cart(models.Model):
user = models.ForeignKey(User, null=True)
session = models.CharField(max_length=32, null=True)
然后,当用户注册时,您可以获取他们的request.session.session_key
并使用他们的新用户 ID 更新所有行。
更好的是,您可以定义一个“UserProxy
”模型:
class Cart(models.Model):
user = models.ForeignKey(UserProxy)
class UserProxy(models.Model):
user = models.ForeignKey(User, unique=True, null=True)
session = models.CharField(max_length=32, null=True)
因此,您只需在用户注册时更新 UserProxy 表,而无需更改购物车的任何内容。
【讨论】:
你想要unique=True
在user = models.ForeignKey(User, unique=True, null=True)
行中。那么您的会话不能定义多个“空”用户,对吗?【参考方案3】:
只需将用户数据保存在用户表中,然后不要填充用户 ID/密码表。
如果用户注册,那么您只需填写这些字段。
您必须定期运行一些“清理”脚本,以清除在任意时间段内未访问过的任何用户。我会让这个清理成为可选的。并有一个可以在服务器端(或通过 Web 管理界面)运行的脚本来清除,以防您的客户想要手动执行。
记得删除所有相关条目以及用户条目。
【讨论】:
【参考方案4】:我以前没有这样做过,但是通过阅读您的描述,当有人需要做一些需要它的事情时,我会简单地创建一个用户对象。然后,您向用户发送一个链接到此用户对象的 cookie,因此如果有人回来(不清除他们的 cookie),他们将获得相同的骨架用户对象。
这意味着您可以使用您当前的代码进行最少的更改,当他们想要迁移到一个完整的注册用户时,您只需使用他们的详细信息填充骨架用户对象。
如果您想保持数据库整洁,您可以添加一个任务,删除过去 30 天内未使用的所有骨架用户。
【讨论】:
+1:匿名用户仍有 IP 地址,可用于创建必要的临时用户 ID,无需密码。当他们注册时,您实际上是在升级他们以拥有正确的名称和密码。 IP 地址不能用作唯一键。想想防火墙 NAT 背后的多个用户。 +1 我用过这种方法,效果很好。正如@ΤZΩΤZΙΟΥ 所说,您不能使用 IP 地址作为标识符,您必须生成 GUID 或向他们询问电子邮件地址或其他内容。以上是关于为匿名用户提供与注册用户相同的功能的主要内容,如果未能解决你的问题,请参考以下文章