2010-05-11 4 views
9

Ich möchte, dass meine Benutzerobjekte alle das gleiche Basisverhalten haben, und dazu muss ich dem anonymen Benutzer ein paar Methoden/Eigenschaften hinzufügen.Was ist der beste Weg, um anonyme Benutzer in Django zu erweitern?

Ich habe bereits Benutzer subclassed, um reichere Benutzerobjekte zu machen, aber ich fragte mich, ob jemand das gleiche für anonymen Benutzer getan hat? Und wenn es irgendwelche bevorzugten Wege gibt, es zu tun!

+2

Ich denke, die bevorzugte Möglichkeit, das Benutzermodell zu erweitern, ist nicht die Klasse 'User' abzuleiten, sondern eine separate 'UserProfile'-Klasse zu erstellen, dann die gewünschten Felder hinzuzufügen und eine ForeignKey-Beziehung zur' User'-Klasse herzustellen . –

+1

Ja, ich kann sehen, warum das vorzuziehen wäre, aber AnonymousUser würde sowieso kein UserProfile haben, da es keine wo zu FK gibt. – Ross

Antwort

8

Ihr Middleware-Vorschlag hat mich zum Nachdenken gebracht, und ich denke jetzt, dass die beste Idee ist, den Standard AuthenticationMiddleware zu überschreiben. Diese Klasse weist der Anforderung ein LazyUser-Objekt zu, das durch Aufruf von an den richtigen Benutzer aufgelöst wird. Dies ist wahrscheinlich der richtige Ort, um Dinge zu überschreiben, so dass es Ihre benutzerdefinierte get_user-Funktion aufruft, die Ihre Unterklasse AnonymousUser zurückgibt.

+1

Works ein Leckerbissen Prost Daniel! Heres eine Kopie für Wohlstand: [benutzerdefinierte Auth - Backend] (http://gist.github.com/397817) – Ross

+0

Posterity ,, sry im Voraus, auch, danke – jfunk

0

Sie sollten eine Unterklasse erstellen oder ein Modell erstellen, das eine Eins-zu-Eins-Beziehung mit der AnonymousUser class hat.

+0

Unterklasse wäre ideal, aber es ist mehr über die praktischen Möglichkeiten, dies zu tun, wie die AnonymousUser-Klasse direkt an einer Reihe von Orten importiert wird. – Ross

2

Ich fange an zu denken, eine Middleware ist wahrscheinlich die einfachste Lösung, die die request.user Klasse überprüft und wenn AnonymousUser dann durch eine Unterklasse AnonymousUser ersetzt, die die zusätzlichen Eigenschaften hat.

Das klingt vernünftig?

1

Ein einfaches und allgemein (aber weniger sicher) Lösung einfach sein würde django.contrib.auth.models.AnonymousUser mit Ihrer eigenen Klasse ersetzen:

class YourAnonymousUser(...): 
    ... 


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

Ab 1.10.5, lazily Django die anonyme Benutzerklasse importiert, so hat man habe keine Probleme mit Core Django. Sie interagieren auch selten mit direkt, da Sie einfach .is_anonymous() verwenden könnten, also sollten Sie in Ordnung sein, solange Sie wissen, wie Ihre Abhängigkeiten AnonymousUser verwenden.

1

Am besten verwenden Sie ein Python-Paket (oder schreiben Sie Ihr eigenes), das die Standard-AnonymousUser-Klasse von Django gegen Ihre eigene Klasse eintauscht. Sie können eine Middleware dafür implementieren (ich denke, es ist der beste Ort).

Zum Beispiel können Sie django-custom-anonymous verwenden, um die Anpassung von AnonymousUser zu ermöglichen. Sie können es auch auf pypi finden.

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentliche Teile der Antwort hier und bieten den Link als Referenz. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/18949949) –

Verwandte Themen