[PYTHON] Erstellen Sie eine Authentifizierungsfunktion mit django-allauth und CustomUser in Django

Einführung

Ich wollte mich mit django-allauth und CustomUser authentifizieren, aber es gab nur wenige japanische Artikel und es war schwierig, einen guten englischen Artikel zu finden. Deshalb werde ich einen Kommentar und ein Programm veröffentlichen, in dem ich süchtig nach Proben war.

Inhaltsverzeichnis

1.sample 2. [Ich war süchtig nach](# 2 Ich war süchtig nach) 3. [Dateistruktur](# 3 Dateistruktur) 4. url.py 5. settings.py 6. models.py 7. forms.py 8. adapter.py 9. templates 10. [Referenz](# 10 Referenz)

1.sample samplecode(Github)

Wenn ich es tatsächlich bewege, sieht es so aus. 1573995017.jpg

2. Ich bin süchtig nach

3. Dateistruktur

testsite/  ├templates/  │    ├accounts/  │    │   └registration/  │    │       └login.html/  │    │       └signup.html/  │   ├testapp/  │   │   └home.html  │   └base.html  ├testapp/  │   ├__pycache__  │   ├migrations  │   ├adapter.py  │   ├admin.py  │   ├apps.py  │   ├forms.py  │   ├models.py  │   ├tests.py  │   ├urls.py  │   └views.py  ├testsite/  │   ├__pycache__  │   ├__init__  │   ├settings.py  │   ├urls.py  │   └wsgi.py  └manage.py

4.url.py

url.py


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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include('testapp.urls')),
    path('accounts/', include('allauth.urls')),
    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'),
]

5.settings.py Benutzer-, Anmeldeformular- und Adaptereinstellungen sind erforderlich.

settings.py


import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

SECRET_KEY = ''

DEBUG = True

ALLOWED_HOSTS = ['*']

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'testapp.apps.TestappConfig',#testapp
    'django.contrib.sites', #for djnago-allauth
    'allauth', #for djnago-allauth
    'allauth.account', #for djnago-allauth
    'allauth.socialaccount',#for djnago-allauth
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'testsite.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'testsite.wsgi.application'

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

USE_I18N = True

USE_L10N = True

USE_TZ = True

STATIC_URL = '/static/'

#hinzufügen
AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'allauth.account.auth_backends.AuthenticationBackend',
)

#Ändern Sie die Authentifizierungsmethode in "E-Mail-Adresse und Passwort".
ACCOUNT_AUTHENTICATION_METHOD = 'email'
#Verwenden Sie den Benutzernamen
ACCOUNT_USERNAME_REQUIRED = True

#Senden Sie keine Bestätigungs-E-Mail zur Benutzerregistrierung
ACCOUNT_EMAIL_VERIFICATION = 'none'
#Machen Sie die E-Mail-Adresse zu einem erforderlichen Element
ACCOUNT_EMAIL_REQUIRED = True

#Benutzermodellerweiterung(customuser)
AUTH_USER_MODEL = 'testapp.CustomUser'

SITE_ID = 1 #django-Weil allauth das Sites Framework verwendet

LOGIN_REDIRECT_URL = 'home'
ACCOUNT_LOGOUT_REDIRECT_URL = '/accounts/login/'
ACCOUNT_LOGOUT_ON_GET = True

#Geben Sie das Anmeldeformular an
ACCOUNT_FORMS = {
    'signup' : 'testapp.forms.CustomSignupForm',
}
#Wird benötigt, um Informationen aus dem Anmeldeformular im benutzerdefinierten Benutzermodell zu speichern
ACCOUNT_ADAPTER = 'testapp.adapter.AccountAdapter'
#Passwort sofort eingeben
ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE = False

6.models.py

models.py


from django.db import models
from django.contrib.auth.models import AbstractUser

# Create your models here.
class CustomUser(AbstractUser):
    """Erweitertes Benutzermodell"""
    class Meta(AbstractUser.Meta):
        db_table = 'custom_user'

    age = models.IntegerField('Alter', blank=True, default=0)
    weight = models.IntegerField('Körpergewicht',blank=True, default=0)

7.forms.py

forms.py


from allauth.account.forms import SignupForm
from django import forms
from .models import CustomUser
from allauth.account.adapter import DefaultAccountAdapter

class CustomSignupForm(SignupForm):
    age = forms.IntegerField()
    weight = forms.IntegerField()
    
    class Meta:
        model = CustomUser

    def signup(self, request,user):
        user.age = self.cleaned_data['age']
        user.weight = self.cleaned_data['weight']
        user.save()
        return user

8.adapter.py

adapter.py


from allauth.account.adapter import DefaultAccountAdapter

class AccountAdapter(DefaultAccountAdapter):

    def save_user(self, request, user, form, commit=True):
        """
        This is called when saving user via allauth registration.
        We override this to set additional data on user object.
        """
        # Do not persist the user yet so we pass commit=False
        # (last argument)
        user = super(AccountAdapter, self).save_user(request, user, form, commit=False)
        user.age = form.cleaned_data.get('age')
        user.weight = form.cleaned_data.get('weight')
        user.save()

9.templates

base.html


<!doctype html>
<html lang="ja">

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <title>{% block title %}{% endblock %}</title>

    {# --- css --- #}
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"
        integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
    <style type="text/css">
        body {
            padding-top: 5rem;
        }
    </style>
    {% block extra_css %}{% endblock %}
</head>

<body>
    <main class="container">
        {% block content %}{% endblock %}
    </main>

    {# --- js --- #}
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
        integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous">
    </script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"
        integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous">
    </script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"
        integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous">
    </script>
    {% block extra_js %}{% endblock %}
</body>

</html>

account/registration/login.html


<!doctype html>
{% extends "base.html" %}

{% block title %}Einloggen{% endblock %}

{% block content %}
<h2>Einloggen</h2>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Einloggen</button>
</form>
{% endblock %}

account/registration/signup.html


<!doctype html>
{% extends "base.html" %}

{% block title %}Benutzer Registration{% endblock %}

{% block content %}
<h2>Benutzer Registration</h2>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <p><a href="{% url 'login' %}"><button type="submit">Benutzer Registration</button></a></p>
</form>
{% endblock %}

testapp/home.html


<!doctype html>
{% extends "base.html" %}

{% block title %}Zuhause{% endblock %}

{% block content %}
<h2>Zuhause</h2>
{% if user.is_authenticated %}
Herzlich willkommen{{ user.get_username }}Herr.
Wie alt bist du{{ user.age }}ist
Dein Gewicht{{ user.weight }}kg
<p><a href="{% url 'logout' %}">Ausloggen</a></p>
{% else %}
<p><a href="{% url 'login' %}">Einloggen</a></p>
<p><a href="{% url 'signup' %}">signup</a></p>
{% endif %}
{% endblock %}

10. Referenz

[Akihito Yokose "Lehrbuch von Django, das im Feld verwendet werden kann"](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF % E3% 81% 88% E3% 82% 8B-Django-% E3% 81% AE% E6% 95% 99% E7% A7% 91% E6% 9B% B8% E3% 80% 8A% E5% AE% 9F% E8% B7% B5% E7% B7% A8% E3% 80% 8B-% E6% A8% AA% E7% 80% AC-% E6% 98% 8E% E4% BB% 81-ebook / dp / B07L3DRGBT? Tag = maftracking264432-22 & linkCode = ure & creative = 6339) Offizielle 1 von django-allauth Offizielle 2 von django-allauth the-complete-django-allauth-guide extending-and-customizing-django-allauth

Recommended Posts

Erstellen Sie eine Authentifizierungsfunktion mit django-allauth und CustomUser in Django
Erstellen Sie eine API mit Django
Erstellen Sie mit Django Updateview einen Update-Bildschirm
Erstellen Sie ein Bild mit Zeichen mit Python (Japanisch)
Erstellen Sie erste Einstellungen und Mitarbeiter-Apps in Django
Implementierung der Authentifizierungsfunktion in Django REST Framework mit djoser
Erstellen Sie Amazon Linux mit AWS EC2 und melden Sie sich an
Erstellen Sie eine API für die Benutzerauthentifizierung mit Django REST Framework
Erstellen Sie mit Django dynamisch Tabellen im Schema und generieren Sie dynamisch Modelle
Erstellen Sie eine Umgebung mit virtualenv
Erstellen Sie mit Flask-AppBuilder ganz einfach Authentifizierung, Benutzerverwaltung und mehrsprachige Systeme
Grundlegende Authentifizierung mit verschlüsseltem Passwort (.htpasswd) mit Flasche in Python
Erstellen Sie eine Homepage mit Django
Minimales Makefile und buildout.cfg, um eine Umgebung mit buildout zu erstellen
Erstellen einer Todo-App mit Django ① Erstellen Sie eine Umgebung mit Docker
Erstellen und listen Sie Django-Modelle auf
So erstellen Sie einen Datenrahmen und spielen mit Elementen mit Pandas
Erstellen Sie mit Django ein benutzerfreundliches Folgemodell mit ManyToManyField through
Ich habe versucht, einen Artikel mit SQL Alchemy auf Wiki.js zu erstellen
Erstellen Sie eine temporäre Datei mit Django als Zip und geben Sie sie zurück
Erstellen Sie mit Vagrant (Ubuntu 16.04) eine Umgebung für Django x Apache x mod_wsgi.
Ausgabe von Firebase-Authentifizierungstoken in Python und Token-Validierung mit Fast API
Laden Sie die Django-Shell mit ipython neu
Laden Sie ein Django-Modul mit einem Interpreter
HTTPS mit Django und Let's Encrypt
Basisauthentifizierung, Digest-Authentifizierung mit Flask
Erstellen Sie eine Altersgruppe mit Pandas
Hinweis: Senden Sie eine E-Mail mit Django
GraphQL-API mit graphene_django in Django
Erstellen Sie mit Django einen Datei-Uploader
Erstellen und lesen Sie Messagepacks in Python
Erstellen Sie mit Django einen LINE-Bot
Implementierung der benutzerdefinierten Authentifizierungsfunktion für Benutzermodelle in Django REST Framework mit djoser
django-allauth verwaltet mehrere Benutzertypen mithilfe des benutzerdefinierten Benutzers (Benutzer mit mehreren Typen).
Erstellen und bearbeiten Sie Tabellenkalkulationen in einem beliebigen Ordner auf Google Drive mit Python
Todo-App mit Django erstellen ④ Ordner- und Aufgabenerstellungsfunktion implementieren
Ich möchte eine API erstellen, die ein Modell mit einer rekursiven Beziehung im Django REST Framework zurückgibt
Erstellen Sie eine Anwendung, indem Sie mit Pygame klassifizieren
Erstellen Sie eine RESTful-API mit dem Django Rest Framework
Erstellen Sie mit PySimpleGUI einen Bildverarbeitungs-Viewer
Passwortlose Authentifizierung mit RDS und IAM (Python)
Durchsuchen Sie eine vorhandene externe Datenbank mit Django
Erstellen Sie schnell eine Excel-Datei mit Python #python
Erstellen Sie die Embulk-Konfiguration und führen Sie sie in Jupyter aus
CentOS 6.4, Python 2.7.3, Apache, mod_wsgi, Django
Umgang mit "Jahren und Monaten" in Python
Erstellen der ersten App mit Django Startprojekt
[Python] Erstellen Sie schnell eine API mit Flask
Generieren Sie eine add-in-fähige Excel-Instanz mit xlwings
Erstellen Sie eine englische Wort-App mit Python
Erstellen und Bereitstellen von Flask-Apps mit PTVS
Ramen-Kartenerstellung mit Scrapy und Django
Erstellen Sie mit cx_Freeze eine aktualisierbare MSI-Datei
Testen Sie das Hochladen von Bildern, indem Sie in Python erstellen, ohne Dummy-Bilddateien in Django zu platzieren
Erstellen Sie eine API zum Konvertieren von PDF-Dateien in TIF-Bilder mit FastAPI und Docker
Lernen Sie mit Jubatus die Trends von Feature-Wörtern in Texten kennen und kategorisieren Sie Ihre Eingabetexte
Erstellen Sie eine Datenanalyseumgebung, die die GitHub-Authentifizierung und Django mit JupyterHub verbindet
Senden Sie eine E-Mail mit einem anderen Benutzer als EMAIL_HOST_USER, der in den Einstellungen in Django geschrieben wurde