在Django中扩展匿名用户的最佳方法是什么?
我想让我的用户对象都有相同的基本行为,为此我需要给匿名用户添加一些方法和属性。
我已经对用户进行了子类化,做出了更丰富的用户对象,但我在想有没有人也对匿名用户做过类似的事情?有没有什么推荐的做法呢!
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
类。