【问题标题】:Whats the best way to extend Anonymous User in Django?在 Django 中扩展匿名用户的最佳方法是什么?
【发布时间】:2011-02-18 00:28:15
【问题描述】:

我想让我的用户对象都具有相同的基本行为,为此我需要向匿名用户添加几个方法/属性。

我已经对 User 进行了子类化以制作更丰富的用户对象,但我想知道是否有人为匿名用户做了同样的事情?如果有任何首选的方法!

【问题讨论】:

  • 我认为扩展用户模型的首选方法不是继承User类,而是创建一个单独的UserProfile类,然后向其中添加所需的字段并建立ForeignKey关系User 类。
  • 是的,我明白为什么这样做更可取,但 AnonymousUser 不会有 UserProfile,因为没有 FK 的位置。

标签: python django authentication


【解决方案1】:

您的中间件建议让我开始思考,我现在认为最好的办法是覆盖标准 AuthenticationMiddleware。该类将LazyUser 对象分配给请求,该对象在访问时通过调用contrib.auth.get_user 解析给正确的用户。这可能是覆盖事物的正确位置,以便它调用您自定义的 get_user 函数,该函数返回您的子类 AnonymousUser

【讨论】:

【解决方案2】:

一个更简单、更通用(但不太安全)的解决方案是将django.contrib.auth.models.AnonymousUser 替换为您自己的类:

class YourAnonymousUser(...):
    ...


import django.contrib.auth.models as django_auth_models
django_auth_models.AnonymousUser = YourAnonymousUser

从 1.10.5 开始,Django 会延迟导入匿名用户类,因此您不会遇到核心 Django 的问题。您也很少直接与AnonymousUser 交互,因为您可以只使用.is_anonymous(),所以只要您知道您的依赖项如何使用AnonymousUser 就可以了。

【讨论】:

  • 您的方法也适用于 WSGI 请求和 DRF 请求,而中间件方法不适用于 DRF。
【解决方案3】:

我开始认为中间件可能是检查 request.user 类的最简单的解决方案,如果是 AnonymousUser,然后将其替换为具有额外属性的子类 AnonymousUser。

听起来有道理吗?

【讨论】:

    【解决方案4】:

    最好的方法是使用 python 包(或自己编写),它将 Django 默认 AnonymousUser 类与您自己的类交换。您可以为此实现一个中间件(我认为这是最好的地方)。

    例如,您可以使用django-custom-anonymous 来提供匿名用户的自定义。你也可以在pypi找到它。

    【讨论】:

      【解决方案5】:

      您可能会使用django-rest-framework,它允许您在类似这样的设置中通过UNAUTHENTICATED_USER 自定义AnonymousUser

      REST_FRAMEWORK = {
          'UNAUTHENTICATED_USER': 'application.AnonymousUser',
      }
      

      请记住,此用户类只能从 DRF views 获得

      【讨论】:

        【解决方案6】:

        您应该继承或创建一个与AnonymousUser class 具有一对一关系的模型。

        【讨论】:

        • 子类化是理想的,但更多的是关于这样做的实用性,因为 AnonymousUser 类是直接导入到许多地方的。
        猜你喜欢
        • 2022-01-05
        • 1970-01-01
        • 2010-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-05
        • 1970-01-01
        • 2020-02-03
        相关资源
        最近更新 更多