【问题标题】:Django storing anonymous user dataDjango 存储匿名用户数据
【发布时间】:2012-12-06 00:05:13
【问题描述】:

我有一个 django 模型,它存储来自表单输入的用户和产品数据:

def ProductSelection(request, template_name='product_selection.html'):
    ...
    if user.is_authenticated():
        user = request.user
    else:
        # deal with anonymous user info
    project = Project.objects.create(
        user=user,
        product=form.cleaned_data["product"],
        quantity=form.cleaned_data["product_quantity"],
    )

当然这对于经过身份验证的用户来说很好,但我也希望能够存储匿名用户项目,并且如果可能的话,在他们最终注册和身份验证时将它们与用户相关联。

我的想法是创建 name = some_variable 的匿名用户(时间戳与随机哈希连接?),然后将该用户名保存在会话数据中。如果我确保该会话变量(如果存在)用于记录该用户的所有项目活动,我应该能够在用户注册时使用用户的真实凭据更新项目。

这是否过于复杂和脆弱?我是否冒着不必要地保存数千行数据的风险?这个常见问题的最佳方法是什么?

我们将不胜感激任何有关这方面的指导。

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    您可以使用Django's session framework 来存储匿名用户数据。

    然后,您可以向您的 Project 模型添加一个字段,以保存匿名用户的 session_key 值,

    project = Project.objects.create(
        user=request.user,  # can be anonymous user
        session=request.session.session_key,
        product=form.cleaned_data["product"],
        quantity=form.cleaned_data["product_quantity"])
    

    或者简单地存储一个 Project 实例在会话中的所有数据

    if user.is_authenticated():
        project = Project.objects.create(
            user=request.user,
            product=form.cleaned_data["product"],
            quantity=form.cleaned_data["product_quantity"])
    else:
        # deal with anonymous user info
        request.session['project'] = {
            "product": form.cleaned_data["product"],
            "quantity": form.cleaned_Data["product_quantity"]}
    

    您可以稍后在创建适当的用户时从会话中检索数据。

    【讨论】:

    • 当我过去遇到类似的问题时,当您需要返回另一个方向时,问题就来了。就像用户可能有多个项目一样,您需要执行一些操作,例如查看哪些会话喜欢两个特定项目。
    • 就我而言,我想将匿名用户数据存储在数据库中,并通过会话将其与特定用户相关联。如果user=request.user 返回一个匿名用户对象,我以后无法在注册时将此信息与用户绑定。
    • 在这种情况下,我的第一个示例应该这样做:添加一个字段来保存 session_key 值,然后您可以在匿名用户停止时检索所需的 Project 实例并将其与新用户相关联匿名:-)
    • 这是否支持将多个对象添加到购物车?
    • @Gonzalo,您在从数据库中查询保存的密钥时不会遇到问题吗?我的钥匙永远不匹配
    【解决方案2】:

    澄清一下,下面的代码是我的解决方案的实现方式:

            project = Project.objects.create(
                session=request.session.session_key,
                # save all other fields
                ...
            )
            if request.user.is_authenticated():
                project.user = request.user
            else:
                # make a copy of the session key
                # this is done because the session_key changes
                # on login/ register 
                request.session['key_copy'] = request.session.session_key
            project.save()
    

    在我的models.py中:

     class Project(models.Model):
         user = models.ForeignKey(User, null=True, blank=True)
         ...
    

    所以用户字段可以为空,在这种情况下,我们使用 session_key 来跟踪事物。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-17
      • 2014-02-08
      • 2013-04-10
      • 1970-01-01
      • 2012-12-07
      • 2021-08-28
      • 2011-09-25
      • 2019-06-26
      相关资源
      最近更新 更多