[PYTHON] Créer une fonction d'authentification à l'aide de django-allauth et CustomUser dans Django

introduction

Je voulais m'authentifier en utilisant django-allauth et CustomUser, mais il y avait peu d'articles en japonais et il était difficile de trouver un bon article en anglais, donc je publierai un commentaire et un programme où j'étais accro à l'échantillonnage.

table des matières

1.sample 2. [«J'étais accro à»](# 2 J'étais accro à) 3. [Structure de fichier](structure de fichier # 3) 4. url.py 5. settings.py 6. models.py 7. forms.py 8. adapter.py 9. templates 10. [Reference](référence n ° 10)

1.sample samplecode(Github)

Quand je le déplace, ça ressemble à ça. 1573995017.jpg

2. Je suis accro à

3. Structure des fichiers

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 L'utilisateur personnalisé, le formulaire d'inscription et les paramètres de l'adaptateur sont requis.

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/'

#ajouter à
AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'allauth.account.auth_backends.AuthenticationBackend',
)

#Changer la méthode d'authentification en "adresse e-mail et mot de passe"
ACCOUNT_AUTHENTICATION_METHOD = 'email'
#Utiliser le nom d'utilisateur
ACCOUNT_USERNAME_REQUIRED = True

#Ne pas envoyer d'e-mail de confirmation d'inscription utilisateur
ACCOUNT_EMAIL_VERIFICATION = 'none'
#Faire de l'adresse e-mail un élément obligatoire
ACCOUNT_EMAIL_REQUIRED = True

#Extension de modèle utilisateur(customuser)
AUTH_USER_MODEL = 'testapp.CustomUser'

SITE_ID = 1 #django-Parce qu'allauth utilise le framework des sites

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

#Spécifiez le formulaire d'inscription
ACCOUNT_FORMS = {
    'signup' : 'testapp.forms.CustomSignupForm',
}
#Nécessaire pour stocker les informations du formulaire d'inscription dans customusermodel
ACCOUNT_ADAPTER = 'testapp.adapter.AccountAdapter'
#Entrez le mot de passe à la fois
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):
    """Modèle utilisateur étendu"""
    class Meta(AbstractUser.Meta):
        db_table = 'custom_user'

    age = models.IntegerField('âge', blank=True, default=0)
    weight = models.IntegerField('poids',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 %}S'identifier{% endblock %}

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

account/registration/signup.html


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

{% block title %}Enregistrement de l'utilisateur{% endblock %}

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

testapp/home.html


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

{% block title %}domicile{% endblock %}

{% block content %}
<h2>domicile</h2>
{% if user.is_authenticated %}
Bienvenue{{ user.get_username }}M.
Quel âge avez-vous{{ user.age }}est
Votre poids{{ user.weight }}kg
<p><a href="{% url 'logout' %}">Se déconnecter</a></p>
{% else %}
<p><a href="{% url 'login' %}">S'identifier</a></p>
<p><a href="{% url 'signup' %}">signup</a></p>
{% endif %}
{% endblock %}

10. Référence

[Akihito Yokose "manuel de django qui peut être utilisé sur le terrain"](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) Officiel 1 de django-allauth Officiel 2 de django-allauth the-complete-django-allauth-guide extending-and-customizing-django-allauth

Recommended Posts

Créer une fonction d'authentification à l'aide de django-allauth et CustomUser dans Django
Créer une API avec Django
Créer un écran de mise à jour avec Django Updateview
Créer une image avec des caractères avec python (japonais)
Créer les paramètres initiaux et les applications de personnel dans Django
Implémentation de la fonction d'authentification dans Django REST Framework à l'aide de djoser
Créez Amazon Linux avec AWS EC2 et connectez-vous
Créer une API autour de l'authentification des utilisateurs avec Django REST Framework
Créez dynamiquement des tables dans un schéma avec Django, générez dynamiquement des modèles
Créer un environnement avec virtualenv
Créez facilement des systèmes d'authentification, de gestion des utilisateurs et multilingues avec Flask-AppBuilder
Authentification de base avec mot de passe crypté (.htpasswd) avec bouteille en python
Créer une page d'accueil avec django
Makefile minimal et buildout.cfg pour créer un environnement avec buildout
Créer une application Todo avec Django ① Créer un environnement avec Docker
Créer et lister des modèles Django
Comment créer une trame de données et jouer avec des éléments avec des pandas
Créez un modèle de suivi facile à utiliser avec Django en utilisant ManyToManyField via
J'ai essayé de créer un article dans Wiki.js avec SQL Alchemy
Créez un fichier temporaire avec django sous forme de zip et renvoyez-le
Créer un environnement pour Django x Apache x mod_wsgi avec Vagrant (Ubuntu 16.04)
Émission de jetons d'authentification Firebase en Python et validation de jetons avec Fast API
recharger dans le shell django avec ipython
Charger les modules Django avec un interpréteur
HTTPS avec Django et Let's Encrypt
Authentification de base, authentification Digest avec Flask
Créez une tranche d'âge avec les pandas
Remarque: envoyer un e-mail avec Django
API GraphQL utilisant graphene_django dans Django
Créer un téléchargeur de fichiers avec Django
Créer et lire des paquets de messages en Python
Créer un bot LINE avec Django
Implémentation de la fonction d'authentification du modèle utilisateur personnalisé dans Django REST Framework à l'aide de djoser
django-allauth gère plusieurs types d'utilisateurs à l'aide d'un utilisateur personnalisé (utilisateur multi-type)
Créez et modifiez des feuilles de calcul dans n'importe quel dossier sur Google Drive avec python
Créer une application Todo avec Django ④ Implémenter la fonction de création de dossier et de tâche
Je souhaite créer une API qui retourne un modèle avec une relation récursive dans Django REST Framework
Créer une application en classifiant avec Pygame
Créer une API RESTful avec Django Rest Framework
Créer une visionneuse de traitement d'image avec PySimpleGUI
Authentification sans mot de passe avec RDS et IAM (Python)
Parcourir une base de données externe existante avec Django
Créez rapidement un fichier Excel avec Python #python
Créer et exécuter la configuration d'embulk dans Jupyter
CentOS 6.4, Python 2.7.3, Apache, mod_wsgi, Django
Gérer les "années et mois" en Python
Création de la première application avec Django startproject
[Python] Créez rapidement une API avec Flask
Générer une instance Excel compatible avec les compléments avec xlwings
Créez une application de mots anglais avec python
Créez et déployez des applications Flask avec PTVS
Création de carte Ramen avec Scrapy et Django
Créez un fichier msi évolutif avec cx_Freeze
Créer en Python sans fichier image factice dans Django et tester le téléchargement de l'image
Créez une API pour convertir des fichiers PDF en images TIF avec FastAPI et Docker
Apprenez les tendances des mots clés dans les textes avec Jubatus et classez vos textes d'entrée
Créer un environnement d'analyse de données qui relie l'authentification GitHub et Django avec JupyterHub
Envoyer un e-mail avec un utilisateur autre que EMAIL_HOST_USER écrit dans les paramètres de django