1

Ich implementiere social-app-django (nicht die veraltete; die, die auf Python-social-auth beruht) mit Django 1.11 (nicht mit Mongo). Meine Anwendung muss viele Daten von Benutzern speichern und bearbeiten, die nicht zu den Konten gehören, die bei der Anmeldung von ihren Social Media-Konten abgerufen werden.Benutzermodell oder benutzerdefinierte Pipeline in Social-App-Django erweitern

Ich muss keine zusätzlichen Daten abrufen oder sammeln, wenn der Benutzer sich authentifiziert, aber verschiedene Aktionen, die sie auf meiner Site ausführen, müssen in ihrem Benutzermodell gespeichert werden. Ich frage mich, welche der folgenden Ansätze bevorzugt wird (ich habe ausgiebig online recherchiert, kann aber nicht eine bestimmte Erklärung, warum finden eine gegen das andere verwenden):

  • mein eigenes Benutzermodell erstellen in meinem App models.py (nennen Sie es MyUser), die nichts Besonderes erweitert, und fügen Sie dann eine Funktion in der Authentifizierungspipeline, die den Social-App-Django-Benutzer mit einer entsprechenden Instanz von MyUser verbindet. Belassen Sie AUTH_USER_MODEL und SOCIAL_AUTH_USER_MODEL unverändert.

    oder ...

  • erstellen mein eigenes Benutzermodell in models.py meine App und in der settings.py des Projekts AUTH_USER_MODEL und SOCIAL_AUTH_USER_MODEL-MyUser zu zeigen. Lassen Sie die Pipeline unverändert. In diesem Fall habe ich mich gefragt, ob jemand klären könnte, was MyUser und sein Manager erweitern sollte und was ich in modules.py importieren muss (ich bin verwirrt, weil viele Stack-Überlauf-Posts auf veraltete Versionen dieses Moduls und auf I verweisen) behalte immer Fehler). In diesem Fall sollte ich auch beide AUTH_USER_MODELundSOCIAL_AUTH_USER_MODEL, oder nur eine davon?

Erzielen diese beiden Methoden im Wesentlichen die gleiche Sache? Ist eine mehr zuverlässig/aus irgendeinem Grund bevorzugt? Oder sollte ich beides tun? Vielen Dank für jede Hilfe. Ein weiteres Detail: Ich möchte nicht nur von der App, die ich gerade erstelle, auf die Benutzerdatenbank zugreifen können, sondern auch von anderen Apps (innerhalb des gleichen Django-Projekts), die ich in Zukunft erstellen werde. Beeinflusst das irgendetwas?

Antwort

1

Da ich sehe, dass dies eine anständige Anzahl von Ansichten hat, werde ich die Lösung posten, die ich schließlich kam.

Sowohl django als auch social-app-django (oder ein anderes soziales Authentifizierungsmodul) verwenden das Standardmodell User für die Authentifizierung. Es ist zwar möglich, dieses Modell zu bearbeiten, um benutzerdefinierte Parameter hinzuzufügen, aber ich empfehle es nicht. Es ist keine gute Abstraktion oder Modularisierung. Wenn Sie bei der Konfiguration des Modells einen Fehler machen, werden Sie nicht nur eine bestimmte Funktion auf Ihrer Site unterbrechen, sondern möglicherweise auch die Authentifizierung selbst unterbrechen.

Die einzigen Umstände, unter denen Sie das Standardbenutzermodell selbst bearbeiten könnten, sind, wenn Sie Änderungen vornehmen müssen, die den Authentifizierungsablauf selbst betreffen (z. B. Hinzufügen eines eigenen benutzerdefinierten Authentifizierungsanbieters).

Es ist viel einfacher und sicherer, ein neues Modell namens UserProfile mit einer erforderlichen Eins-zu-Eins-Beziehung zu einem User Objekt zu erstellen. Jetzt können Sie das Objekt User als Authentifizierungsteil und das Objekt UserProfile als Inhalt/Speicherbereich behandeln.Sie müssen nicht sehr oft mit dem User Modell zu tun haben, und das UserProfile Modell spielt keine Rolle für die Authentifizierung. Beachten Sie, dass Sie in dieser Konfiguration NICHT die Felder AUTH_USER_MODEL oder SOCIAL_AUTH_USER_MODEL in der Datei settings.py ändern müssen.

Wenn Sie diesen Ansatz nehmen, müssen Sie einen benutzerdefinierten Schritt in der Authentifizierungs-Pipeline hinzufügen, in dem Sie ein neues UserProfile-Objekt erstellen und es mit den User assoziieren, die derzeit in einloggt.

Verwandte Themen