[PYTHON] Die Geschichte, schmerzhafte Augen zu sehen, wenn man sich süß umschaut (versuchen Sie, die Authentifizierung mit django-allauth einzuführen).

Einführung

Dieses Mal nahm ich in 6 Wochen an einem Projekt von der Teambildung bis zur Produktfreigabe teil. Bitte beachten Sie den Link unten für das gesamte Projekt. Ich möchte, dass Sie die Artikel und früheren Artikel über mich lesen, aber kurz gesagt, ich bin unerfahren und suche einen Ingenieur.

Klicken Sie hier für das Projekt

In diesem Artikel geht es um den Authentifizierungsteil der Funktionen, für die ich für das Projekt verantwortlich war. Es gibt viele Möglichkeiten, sogenannte authentifizierungsbezogene Funktionen wie Anmelden, Anmelden, Abmelden, Zurücksetzen des Passworts, Zurücksetzen der E-Mail-Adresse usw. zu implementieren. Für Anfänger ist es ein Muss und macht Lust, die Initiative zu ergreifen. Dieses Mal ist es ein Paket, das eine Option sein wird, wenn ich mit Django ein soziales Login einführe, zusammen mit der Geschichte, die ich während meiner Entwicklung als Team versucht und bitter gefühlt habe. Ich möchte etwas tiefer in die Einführung von "Django-Allauth" eintauchen.

Was kann man mit Django-Allauth machen?

Wie Sie sehen, können Sie bei der Einführung alle erforderlichen Schritte zur Authentifizierung ausführen. Wie ich werden diese jedoch so verwendet, dass sie die Standardauthentifizierungsfunktion von Django ersetzen.

** Vielleicht ist es möglich, wenn Sie dies tun, während Sie sich die Kommentarseite ansehen **

Wenn Sie eine süße Idee haben wie Es funktioniert nicht wie erwartet und Sie haben es schwer.

Dinge, die bei der Implementierung der Authentifizierung zu beachten sind

Dieses Mal nahm ich an einem Projekt zur Erstellung einer Webanwendung als Team teil (im Folgenden als Projekt bezeichnet), und ich war dort für ungefähr zwei Funktionen der Anwendung verantwortlich, und ich war auch separat für die Authentifizierung verantwortlich. Dies ist die Prämisse dieser Geschichte.

Hier sind einige Dinge zu beachten, wenn Sie die Authentifizierung implementieren, die Sie empfunden haben, als Sie an dem Projekt teilgenommen und es tatsächlich als Team entwickelt haben. (Ich schäme mich zu sagen, dass ich immer noch auf der Suche nach einem Job bin und keine Berufserfahrung habe. Ich hoffe, Sie nehmen das als Gefühl.)

――Bei dem ersten MTG werden der PL und die für das Design verantwortliche Person sowie das Benutzermodell und die Authentifizierungsmethode gründlich gerieben und die Spezifikationen festgelegt.

→ Das Benutzermodell ist untrennbar mit der Authentifizierung verbunden. Gleichzeitig besteht für Webanwendungen in der Regel eine Referenzbeziehung zu dem für jede Funktion verwendeten Modell und dem ersten externen Schlüssel. Mit anderen Worten, sobald das Benutzermodell migriert ist, kann es nicht mehr geändert werden, und ich denke, es ist besser, dies überhaupt nicht zu tun. Aus diesem Grund dachte ich, dass es einfacher wäre, Probleme zu vermeiden, wenn die Designer ihre Ansichten zu den Design- und Zertifizierungsspezifikationen beim ersten MTG teilen und die zu übernehmenden Pakete auswählen würden. Es war. Da ich dies vernachlässigte, als ich für diese Zeit verantwortlich war, schrieb ich das Modell willkürlich um und entschied die Spezifikationen willkürlich, was zu einer nicht besseren Implementierung führte. Das war eine sehr schlechte Sache für die Teamentwicklung ...

Wie oben erwähnt, ist die Authentifizierung untrennbar mit dem Benutzermodell verbunden. Wenn Sie beispielsweise die Django-Standardauthentifizierung wie diese durch eine paketbasierte Authentifizierung ersetzen, werden Sie das Paket nicht verstehen und sich daran gewöhnen. Es gibt viele Orte, an denen es Unannehmlichkeiten oder Dinge gibt, die aufgrund von Faktoren wie Mangel schief gehen. In diesem Fall muss das Benutzermodell neu definiert und die Migration wiederholt werden. In diesem Fall wird jedoch ein Abhängigkeitsfehler auf der DB-Seite und in diesem Fall zunächst "django-allauth" angezeigt Ich hatte mich nicht für die Einführung von `entschieden, also musste ich das Verzeichnis ändern und die Anzahl der unerwarteten Aufgaben nahm zu. Darüber hinaus gibt es einige Funktionen, die nur entwickelt werden können, wenn die Authentifizierung implementiert ist. Diese Funktion war auch in diesem Projekt verfügbar. Da die Authentifizierung diesmal jedoch verschoben wird, wird sich die Entwicklung dieser Funktion verzögern. Es ist ein Problem aufgetreten. (Dies wurde auch als ein Punkt erwähnt, über den PL nachdenken sollte)

Über Django-Allauth

Was Sie mit der Einführung machen können, ist wie ich am Anfang geschrieben habe. Um es zu installieren, drücken Sie den Installationsbefehl mit pip usw.

#Beispiel
pip install django-allauth

Fügen Sie nach der Installation die folgenden Elemente zur Datei Django settigs.py hinzu


AUTHENTICATION_BACKENDS = [
    ...
    # Needed to login by username in Django admin, regardless of `allauth`
    'django.contrib.auth.backends.ModelBackend',

    # `allauth` specific authentication methods, such as login by e-mail
    'allauth.account.auth_backends.AuthenticationBackend',
    ...
]

INSTALLED_APPS = [
    ...
    'django.contrib.sites',
    'allauth',
    'allauth.account',
    'allauth.socialaccount',

    #Bitte geben Sie den sozialen Anbieter an, den Sie für die soziale Anmeldung verwenden möchten. Sie können mehrere angeben
    'allauth.socialaccount.providers.google',
]

SITE_ID = 1


Das ist alles für die Mindestwerte, die angegeben werden müssen. Wenn Sie mit Django zu tun haben, kennen Sie wahrscheinlich den TEMPLATE-Teil und die statischen Ordnereinstellungen, daher werde ich die Details weglassen. Die meisten Vorlagen werden durch "Vorlagen" angegeben. Wenn Sie jedoch einen separaten Ordner erstellen und alle von allauth dort verwendeten Vorlagen verwalten möchten, legen Sie diese bitte einzeln fest.

Fügen Sie danach die folgenden Elemente zu urls.py hinzu (die Datei im selben Verzeichnis wie settings.py, nicht für jede Anwendung vorbereitet).


urlpatterns = [
    ...
    path('accounts/', include('allauth.urls')),
    ...
]

Danach ist es in Ordnung, wenn Sie in der Anwendung der Authentifizierungsfunktion wie folgt in urls.py (App mit Benutzermodell) routen.

from django.contrib import admin
from django.urls import include, path
from django.views.generic import TemplateView

app_name = 'accounts'

urlpatterns = [
    path('accounts/login/',
         TemplateView.as_view(template_name='login.html'), name='login'),
    path('accounts/logout/',
         TemplateView.as_view(template_name='logout.html'), name='logout'),
    path('accounts/signup/',
         TemplateView.as_view(template_name='signup.html'), name='signup'),
]


Danach migrieren Sie bitte. Informationen zur Migration finden Sie auch im Abschnitt zur Fehlerbehebung. Erstellen Sie nach der Migration einen Administrator mit dem Befehl "Superuser erstellen" und greifen Sie auf die Administrationssite zu. Bitte beziehen Sie sich auf das Dokument des Referenzartikels, z. B. die Einstellung zur Authentifizierung mit django-allauth.

Übrigens, wenn Sie django-allauth installieren und migrieren, zusätzlich zum Standard und jedem Anwendungsmodell

--Seite? ˅ --Konto

 allauthモデル.png

Drei Modelle werden automatisch hinzugefügt. Unter diesen ist es notwendig, den Schlüssel jedes sozialen Anbieters zu registrieren, wie in der Abbildung unten im Modell des sozialen Kontos gezeigt. Sie können es auch mit "settings.py" angeben, aber diesmal habe ich die Verwaltungssite betreten und mich registriert.

socialモデル.png

Alles was Sie tun müssen, ist eine Vorlage zu erstellen und fertig. Natürlich können Sie auch CSS anwenden. Es ist jedoch schwierig für diejenigen, die mit dem Mechanismus von Vorlagen nicht vertraut sind, und das Anpassen von "django-allauth" ist ein wenig kompliziert Referenz, so der Autor Ich denke, es ist eine gute Idee, den Vorlagenteil aus einem der Repositorys auszuleihen, anzuwenden und zu bearbeiten, während Sie mit dem Developer Tool überprüfen, wie er tatsächlich im Browser angezeigt wird. Insbesondere wenn Sie CSS einzeln anwenden möchten, ist es ehrlich gesagt mühsam, nur die Vorlage zu verwenden. Wir empfehlen daher, dies in diesem Prozess zu tun.

django-allauth-Repository

Als Prozedur

  1. Erstellen Sie einen Kontoordner unter Vorlagen. Wenn Sie ein soziales Login einführen möchten, erstellen Sie auch einen Ordner für soziale Konten
  2. Verwalten Sie andere Vorlagen für den Authentifizierungsbildschirm als das Konto für soziale Anmeldungen im Konto und verwalten Sie Vorlagen für soziale Anmeldungen im Ordner für soziale Konten.

Es ist nur so dass. In Bezug auf die Anwendung von CSS ist es dasselbe wie das von gewöhnlichem Django, daher werde ich es weglassen.

In diesem Projekt angenommene Elemente

Der Zweck dieses Projekts sind die folgenden drei Punkte.

—— Erstellen eines Ortes, an dem die Teilnehmer konstruieren können

—— Erleben Sie Verfahren und Methoden zur Teamentwicklung

――Nachdem wir den beiden oben genannten Punkten Vorrang eingeräumt haben, werden wir den Grad der Perfektion als Webanwendung verbessern, soweit dies die Teilnehmer können.

Diesmal, wie oben erwähnt, was bei der Verwendung von "django-allauth" implementiert wurde

Es gab nur zwei Punkte. Dies ist eine Folge meiner Unkenntnis von "Django-Allauth" und der Tatsache, dass sich der Fortschritt anderer Teilnehmer verlangsamte, weil die Authentifizierungsarbeit nicht priorisiert wurde. Ursprünglich zumindest zusätzlich zu den oben genannten

Ich denke, es ist eine große Überlegung, dass ich das nicht tun konnte, weil ich die 5 Punkte hätte einbeziehen sollen.

Verarbeitung im Zusammenhang mit der Sitzung

In zusätzlichen Aufgaben

** Verknüpfen Sie die Umfrageergebnisse mit registrierten Benutzern aus der Sitzung, wenn Sie auf die Schaltfläche zum Erstellen eines Kontos klicken. **

Da mir die Hinzufügung der Verarbeitung gegeben wurde, entspricht es.


#Spezifischer Verarbeitungscode
def update_question_result(user_info, question_result_info):
    question_result_obj = QuestionResult.objects.get(
        id=question_result_info)
    user_obj = CustomUser.objects.get(id=user_info)
    question_result_obj.customuser_obj = user_obj
    data_to_update = question_result_obj.save()

    return data_to_update


#Code zum Aufrufen und Verwenden des obigen Prozesses(views.Der Teil, der py trifft)
class Top(LoginRequiredMixin, View):
    def get(self, request, *args, **kwargs):
        if 'unsaved_answer' in self.request.session and self.request.session['unsaved_answer'] == True:
            user_info = self.request.user.id
            question_result_info = self.request.session["primary_key"]
            update_question_result(user_info, question_result_info)
            self.request.session['unsaved_answer'] = False
        return render(request, 'top/top_page.html', context=context)


Der Code des Verarbeitungsteils wird aus dem tatsächlichen Code extrahiert. Tatsächlich ist der erste Code in einer anderen ".py" -Datei definiert und wird von dem zweiten Code aufgerufen und verwendet, der in der Datei definiert ist, die "views.py" entspricht.

Als Prozess

  1. Der Inhalt des Fragebogens wird bei der Beantwortung des Fragebogens in der DB gespeichert.
  2. Wenn der Benutzer zu diesem Zeitpunkt nicht angemeldet ist, wird er in der Sitzung als "['unsaved_answer'] == True" gekennzeichnet.
  3. Erstellen Sie danach ein Konto und melden Sie sich gleichzeitig an, wenn Sie zur obersten Seite umleiten. Wenn Sie also die Sitzung zu diesem Zeitpunkt überprüfen und das Flag "['unsaved_answer'] == True" aus den Benutzerinformationen aktivieren Die Benutzer-ID wird erfasst, die Benutzerinformationen werden in Form eines Objekts aus der CustomUser-Tabelle erfasst, wobei sie als Schlüssel verwendet werden, und der Aktualisierungsprozess wird für das question_result_obj.customuser_obj des in 1 mit diesem Inhalt registrierten Datensatzes ausgeführt. .. Da question_result_obj.customuser_obj aufgrund des Primärschlüssels und der Beziehung als Objekt registriert ist, tritt ein Fehler auf, wenn das Objekt nicht aktualisiert wird.

Fehlerbehebung

→ Dies ist nicht auf "django-allauth" beschränkt, aber bei der Migration eines Benutzermodells ist es sehr wahrscheinlich, dass ein Fehler in der Abhängigkeit auftritt, wenn die Migration durchgeführt wird, um eine Referenzbeziehung mit einem externen Schlüssel oder dergleichen herzustellen. Also bevor Sie sich daran gewöhnen

  1. Führen Sie "make migraton" und "migrate" für jedes in jeder Anwendung verwendete Modell einzeln durch (geben Sie den Anwendungsnamen nach jedem Befehl an).
  2. Machen Sie "Migrieren" und "Migrieren" von "django.contrib.admin" und "django.contrib.auth"
  3. Nachdem Sie die Installation von django-allauth eingestellt haben, führen Sie make migraton durch und migrate erneut.

Ich denke, Sie sollten Schritte unternehmen wie.

→ Löschen Sie die Datenbankdateien und den Migrationsordner jeder App, kommentieren oder löschen Sie alle Teile, die sich auf "django-allauth" beziehen, aus "settings.py" und "urls.py" und führen Sie dann "Migrationen" in jeder App durch. Führen Sie dann den Befehl migrate aus. Übrigens, wenn ein Fehler um "django.contrib.admin" oder "django.contrib.auth" auftritt und Sie nicht richtig migrieren können, können Sie jedes Element auch aus "settings.py" auskommentieren, um ihn zu beheben. Ist vielleicht möglich.

Ich kann nicht anders, als das Gefühl zu haben, dass die meisten Probleme bei der Authentifizierung auf diesen Migrationsteil zurückzuführen sind. Daher bin ich diesmal auch besorgt. Ich hoffe, es hilft, wenn es eine ähnliche Person gibt.

Am Ende

Die Authentifizierung ist Standard, wenn Sie ein Framework verwenden. Sie können es also tun, wenn Sie es implementieren möchten. Es ist jedoch immer noch schwierig, wenn Sie versuchen, es richtig oder etwas anderes zu tun. Immerhin wurde ich daran erinnert, dass ich nicht an der Zertifizierung herumlecken sollte.

Eine andere Sache, die mir in diesem Projekt aufgefallen ist, war, dass die Authentifizierungsmethode je nach Zweck entsprechend den zu erbringenden Leistungen angemessen festgelegt werden muss. Natürlich geht es nicht um Sicherheit, aber zuerst dachte ich, ich würde meine E-Mail-Adresse und mein Passwort verwenden, um mich anzumelden. Ich habe tatsächlich den Code für den Wechsel von der temporären Registrierung zur vollständigen Registrierung per E-Mail-Authentifizierung geschrieben. Aber für PL

Diesmal handelt es sich eher um ein Produkt (Portfolio) als um eine Dienstleistung. Ist es nicht besser, den Benutzern das Ausprobieren zu erleichtern?

Das Eingeben mit einer E-Mail-Adresse ist mühsam, und einige Benutzer empfinden dies möglicherweise als störend und unangenehm bei der E-Mail-Überprüfung. Aus der Sicht von In der Vergangenheit wurde die Anmeldemethode mit einem Benutzernamen und einem Kennwort geändert. Dafür gibt es sicherlich einen Grund. Wenn Sie es als Ergebnis betrachten, ist es wichtig darauf zu bestehen, dass Sie über so viele Fähigkeiten verfügen oder dass Sie es geschaffen haben, aber mir wurde klar, dass Sie über die Leute nachdenken müssen, die es tatsächlich verwenden. Ich tat.

Nachtrag

In Bezug auf den Social Login-Teil scheint ein Fehler in der Produktionsumgebung aufgetreten zu sein, daher wurde er weinend gelöscht. Es wäre schön gewesen, wenn ich damit umgehen könnte, aber es scheint, dass die Maßnahmen ergriffen wurden, weil es eine Funktion war, die ursprünglich nicht erwartet wurde und die in naher Zukunft keine Probleme verursachen würde. Schließlich scheint die Zertifizierungsbeziehung nicht einfach zu sein ... Ich werde beim nächsten Mal mein Bestes geben.

Referenz

django-allauth document Django-allauth einstellen [Django] Verfahren zum Implementieren der sozialen Authentifizierung mit django-allauth Jango-Django django-allauth implementiert eine schnelle soziale Anmeldefunktion Verfahren zum Anpassen der Django-Allauth-Vorlagendatei Erstellen eines Anmeldebildschirms in Django allauth

Recommended Posts

Die Geschichte, schmerzhafte Augen zu sehen, wenn man sich süß umschaut (versuchen Sie, die Authentifizierung mit django-allauth einzuführen).
Die Geschichte der Einführung einer Multi-Faktor-Authentifizierungsfunktion unter Verwendung eines Einmalkennworts in einer Java-Anwendung
Versuchen Sie es mit dem Sammlungsmodul (ChainMap) von python3