注: この記事は当初、私のサブスタック (https://andresalvareziglesias.substack.com/
) に投稿されました。
これは、この Django AllAuth 一連の投稿の最後の章です。これら 5 つの章で、すべての認証ニーズを処理するための非常に役立つ Django コンポーネントという、ちょっとした不思議な要素を発見しました。この章では、基本的な Django ユーザー モデルを拡張してカスタム フィールドを追加する方法を学びます。
AllAuth は、標準の Django ユーザー モデルに加えて、ソーシャル ログインとログイン トークンを処理するための追加のテーブルを使用します。 Django 5 では、ユーザー モデルは django.contrib.auth パッケージにあり、公式ドキュメントにあるように、事前定義されたフィールドが多数あります:
これだけではプロジェクトには不十分な場合があります。 Django を使用すると、カスタムのユーザー テーブルとユーザー マネージャーを作成して、あらゆるプロジェクトのニーズに対応できます。
ログインおよび登録プロセスを処理するために、カスタム User テーブルとカスタム UserManager を作成します。
サンプル プロジェクトで models.py を開き、次のようなコードを記述します:
class MyCustomUser(AbstractBaseUser): email = models.EmailField(unique=True) first_name = models.CharField(max_length=30, blank=True) last_name = models.CharField(max_length=30, blank=True) is_active = models.BooleanField(default=True) is_admin = models.BooleanField(default=False) timezone = models.CharField(max_length=30, default='UTC') is_custom = models.BooleanField(default=False) is_staff = models.BooleanField(default=False) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) objects = MyCustomUserManager() USERNAME_FIELD = 'email' EMAIL_FIELD = 'email' def __str__(self): return self.email def has_perm(self, perm, obj=None): return True def has_module_perms(self, app_label): return True @property def is_utc(self): return self.timezone == 'UTC'
Django の AbstractBaseUser モデルを拡張して新しい User モデルを定義できます。この新しいモデルでは、必要なすべてのフィールドまたはカスタム プロパティを追加できます。
次の行は重要です:
objects = MyCustomUserManager() USERNAME_FIELD = 'email' EMAIL_FIELD = 'email'
これらの行で、ユーザー モデルをカスタム UserManager にリンクし、一意の「ユーザー名」として機能するフィールドも定義しています。
Django 管理ツールから管理するには、必ず新しいモデルを admin.py に登録してください。
from django.contrib import admin from .models import MyCustomUser admin.site.register(MyCustomUser)
サンプル プロジェクトで models.py をもう一度開き (または、必要に応じてカスタム UserManager 用に別のファイルを生成し)、次のようなコードを記述します:
class MyCustomUserManager(BaseUserManager): def create_user(self, email, password=None): if not email: raise ValueError('Users must have an email address') user = self.model( email=self.normalize_email(email), ) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, email, password): user = self.create_user( email=email, password=password, ) user.is_admin = True user.is_staff = True user.save(using=self._db) return user
この例では、BaseUserManager を拡張してカスタム UserManager を作成します。新しいユーザーが作成され、期待どおりにカスタム フィールドが入力されます。
カスタム User モデルの UserManager の前に定義したため、Django は新しいユーザーの作成中にどのクラスを使用するかを認識します。
プロジェクトの設定ファイルで、次のようにプロジェクトの現在のユーザー モデルを設定できます。
# Set custom user model as the active one AUTH_USER_MODEL = 'demo.MyCustomUser' # Configure AllAuth username related management, because we are # using the e-mail as username. See: # https://docs.allauth.org/en/latest/account/advanced.html ACCOUNT_AUTHENTICATION_METHOD = 'email' ACCOUNT_EMAIL_REQUIRED = True ACCOUNT_UNIQUE_EMAIL = True ACCOUNT_USERNAME_REQUIRED = False ACCOUNT_USER_MODEL_USERNAME_FIELD = None
この小さな変更 (および通常どおり必要な DB 移行) だけで、AllAuth サインアップ ビューを使用してユーザーの作成を開始し、光沢のあるカスタム UserManager とそのモデルの動作を確認できます。素早く簡単に。
この例ではユーザー名として電子メールを使用しているため、AllAuth ユーザー名関連の管理も無効にします。
この AllAuth シリーズの最終章に到達しました。 AllAuth は、アプリで認証を処理するための素晴らしいライブラリであり、事前定義された統合の大きなリストのおかげで、ソーシャル ログインの操作が特に簡単になります。
これはシリーズの最終章ですが、今後の投稿で AllAuth について再度取り上げます。読んでいただき、コーディングを楽しんでいただきありがとうございます!
Python と Docker の投稿のうち、次のような他の関連トピック (常にテクノロジーとプログラミングのトピックであることを約束します...厳禁) についても書きます。
著者について
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3