2010-05-11 3 views
9

Я хочу, чтобы объекты моего пользователя имели одно и то же базовое поведение, и для этого мне нужно добавить несколько методов/свойств для анонимного пользователя.Каким образом можно расширить анонимный пользователь в Django?

Я уже подклассифицировал пользователя, чтобы сделать более богатые пользовательские объекты, но мне было интересно, сделал ли кто-то подобное для анонимного пользователя? И если есть какие-то предпочтительные способы сделать это!

+2

Я думаю, что предпочтительный способ расширения пользовательской модели - это не подкласс класса 'User', а создание отдельного класса UserProfile, а затем добавление к нему желаемых полей и установление отношения ForeignKey к классу' User' , –

+1

Да, я могу понять, почему это было бы предпочтительнее, но у AnonymousUser не было бы UserProfile в любом случае, поскольку theres нет где FK. – Ross

ответ

8

Ваше предложение промежуточного программного обеспечения заставило меня задуматься, и теперь я думаю, что лучше всего переписать стандарт AuthenticationMiddleware. Этот класс назначает объект LazyUser запросу, который разрешен к правильному пользователю при доступе, вызывая contrib.auth.get_user. Вероятно, это подходящее место для переопределения вещей, так что оно вызывает вашу настраиваемую функцию get_user, которая возвращает ваш подкласса AnonymousUser.

+1

Работает ухаживает за Даниэлем! Heres копия для процветания: [custom auth backend] (http://gist.github.com/397817) – Ross

+0

Posterity, sry заранее, также, спасибо – jfunk

0

Вы должны подклассифицировать или создать модель, которая имеет отношение один к одному с AnonymousUser class.

+0

было бы идеальным, но это более практично, поскольку класс AnonymousUser импортируется непосредственно в нескольких местах. – Ross

2

Я начинаю думать, что промежуточное программное обеспечение, вероятно, является самым простым решением, которое проверяет класс request.user, и если это AnonymousUser, то он заменяет его подклассом AnonymousUser с дополнительными свойствами.

Этот звук разумный?

1

Более простой и более общий (но менее безопасно) решением было бы просто заменить 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.

1

Лучший способ - использовать пакет python (или написать свой собственный), который заменит класс AnonymousUser по умолчанию Django своим собственным классом. Вы можете реализовать для этого промежуточное ПО (я думаю, что это лучшее место).

Например, вы можете использовать django-custom-anonymous, чтобы обеспечить настройку AnonymousUser. Также вы можете найти его на pypi.

+0

Хотя эта ссылка может ответить на вопрос, лучше включить основные части ответа здесь и укажите ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/18949949) –

Смежные вопросы