在Django中扩展匿名用户的最佳方法是什么?

15 投票
6 回答
6884 浏览
提问于 2025-04-15 22:34

我想让我的用户对象都有相同的基本行为,为此我需要给匿名用户添加一些方法和属性。

我已经对用户进行了子类化,做出了更丰富的用户对象,但我在想有没有人也对匿名用户做过类似的事情?有没有什么推荐的做法呢!

6 个回答

2

最好的办法是使用一个Python包(或者自己写一个),这个包可以把Django默认的AnonymousUser类换成你自己的类。你可以为此实现一个中间件(我觉得这是最合适的地方)。

比如,你可以使用django-custom-anonymous来定制AnonymousUser。你也可以在pypi上找到它。

5

一个更简单但不太安全的解决办法,就是把 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 的,应该就没问题。

14

你提到的中间件建议让我思考了一下,现在我觉得最好的办法是重写标准的 AuthenticationMiddleware。这个类会给请求分配一个 LazyUser 对象,当你访问它时,会通过调用 contrib.auth.get_user 来解析出正确的用户。这里可能是重写的最佳位置,这样就可以调用你自定义的 get_user 函数,返回你自己定义的 AnonymousUser 类。

撰写回答