Django アカウント管理アプリ (登録とアクティベーション)
この記事から何を期待できるでしょうか?
前の記事でプロジェクトの骨格構造を作成しました。この記事はそれに基づいて構築します。それはカバーします
- ユーザーと確認コードを含むアカウント データベース構造。
- シリアライザーをモデル化します。
- アカウントの登録、アクティブ化のためのアカウント ビュー。次の記事では、ログイン、トークンの更新、パスワードの変更、パスワードの忘れ、コードの再送信など、残りのビューについて説明します。
読者を飽きさせないように、できるだけ多くの詳細を説明するよう努めますが、Python と Django のいくつかの側面についてはよく知っていることを期待しています。
ソース コードの最終バージョンは https://github.com/saad4software/alive-diary-backend にあります
シリーズの順序
興味があれば過去の記事をチェックしてください!
- ゼロから作る AI プロジェクト、アイデア、生きた日記
- Google AI Studio で実現可能であることを証明してください
- Django API プロジェクトのセットアップ
- Django アカウント管理アプリ (1)、登録とアクティベーション (ここにいますか?)
アカウントアプリの設定
アプリでシリアライザー ファイルを作成しましょう
from rest_framework import serializers from app_account.models import *
app_account/serializers.py
および URL ファイル
from django.urls import path, include from .views import * urlpatterns = [ ]
app_account/urls.py
最後に、プロジェクト URL ファイルを次のように編集して、アプリの URL をプロジェクトの URL に接続しましょう
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('api/account/', include('app_account.urls')), ]
alive_diary/urls.py
これで、プレフィックス「api/account/」を付けて任意のアカウント URL を呼び出すことができます
モデルたち
アカウント アプリのメイン モデルは、もちろん User モデルです
from django.db import models from django.contrib.auth.models import AbstractUser from datetime import timedelta, datetime class User(AbstractUser): userTypes = ( ('A', 'Admin'), ('C', 'Client'), ) role = models.CharField(max_length=1, choices=userTypes, default="C") hobbies = models.CharField(max_length=255, null=True, blank=True) job = models.CharField(max_length=100, null=True, blank=True) bio = models.TextField(null=True, blank=True) country_code = models.CharField(max_length=10, null=True, blank=True) expiration_date = models.DateTimeField(default=datetime.now()+timedelta(days=30))
app_account/models.py
通常、ユーザー モデルをできるだけシンプルにし、その他の詳細をユーザーと 1 対 1 の関係を持つプロファイル モデルに移動する方が良いですが、話を簡略化するために、必要なユーザー情報を追加します。今回は User モデルに直接接続します。
AbstractUser モデルを継承しており、AbstractUser には複数のフィールドが含まれています
class AbstractUser(AbstractBaseUser, PermissionsMixin): username = models.CharField(...) first_name = models.CharField(...) last_name = models.CharField(...) email = models.EmailField(...) is_staff = models.BooleanField(...) is_active = models.BooleanField(...), date_joined = models.DateTimeField(...)
最も重要なものは次のとおりです:
- ユーザー名はログインに使用されます。
- is_active は、未確認のアカウントがログインできないようにするために使用されます。
- is_staff は、管理者 (値が true) と通常のユーザーを区別します。
このプロジェクト ユーザー用に複数のフィールドも追加しました。
- 管理者アカウントとクライアント アカウントを区別するためのロール。この単純なプロジェクトには 2 つのロールしかないため is_staff を使用できますが、より大きなプロジェクトでは 3 つ以上のロールを持つことができるため、このフィールドは権限の処理に不可欠になります。
- 趣味、仕事、略歴 ユーザーについて詳しく知ることは、より良い反映を構築するのに役立ちます。そのため、趣味、仕事、ユーザーが自分自身をどのように表現するかを尋ねています。
- 統計の国コード
- Expiration_date はサブスクリプションベースの有効期限日です。
アカウントのアクティベーション、パスワードの忘れ、コードの再送信のための確認コードを保存および追跡するための確認コード モデルも必要です。
from rest_framework import serializers from app_account.models import *
app_account/models.py
Userモデルと接続し、6桁のコード番号のランダムな値を生成します。有効期限も 24 時間です。ユーザーが複数の電子メール アドレスを検証したい場合に備えて、電子メール ファイルも用意されていますが、これはまれであり、このアプリでは削除できます。次にシリアライザーに移りましょう。
登録API
シリアライザーから始めましょう
from django.urls import path, include from .views import * urlpatterns = [ ]
app_account/serializers.py
Django REST フレームワークの ModelSerializer を使用しています。クラス Meta のユーザー モデル get_user_model() とシリアル化されたフィールドのリストを選択しました。
モデル シリアライザーに 2 つの追加フィールド、password1 とpassword2 を追加しました。それらが同じ値であることを検証するために、validate メソッドを上書きしました。また、有効な電子メールをユーザー名として使用することを強制するために、ユーザー名フィールドにフィールドバリデータを追加しました。
is_valid_email 関数は次のようになります
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('api/account/', include('app_account.urls')), ]
common/utils.py
個人的に、私は正規表現が好きではありません。正規表現を理解したことがありませんが、電子メールを検証する最良の方法のようです。もっと良い方法があれば、ぜひ共有してください。
新しいフィールドのpassword1とpassword2は元のユーザーモデルに属していないため、シリアライザーデータを直接使用して新しいユーザーを作成するために、データディクショナリからそれらを削除し、パスワードフィールドを追加しました。
シリアライザーのベスト プラクティスのジレンマ
- シリアライザーはデータベース クエリを使用し、データベースを編集する必要がありますか?
- それとも基本的なフィールドタイプの検証 (文字列、整数など) のみを行う必要がありますか?
実際には明確な答えはありません。たとえば、Django Rest フレームワーク モデルのシリアライザーは、同じ名前の使用を作成しようとしたときに発生するシリアライザー エラーのように、固有のフィールドに対してクエリを作成するようです。これはシリアライザーによって生成されました。ビューではありません。
Create、Save、Update メソッドは値をデータベースに書き込みます。
それでも、ビュー内でのみデータベースにアクセスすることは、関心事の分離 と 柔軟性 により一致しているようです。
どれが良いと思いますか?
私は物事を分離すること、さらにはデータベース クエリとデータベース更新メソッドを分離することについてたくさん読みました。それでそれをやってみましょう。 views.py ファイルで AccountActivateView を作成すると、次のようになります。
私たちの場合、RegisterSerializer の create メソッドを上書きして、新しいユーザーと検証コードを即座に作成し、シリアライザーから検証コードを送信することもできます。
代わりに、モデル関連の操作をビュー ファイルに保持します
登録画面に移動しましょう
from rest_framework import serializers from app_account.models import *
app_account/views.py
Rest フレームワークの CreatAPIView を使用しており、serializer_class のスキーマを持つ POST リクエストを受け入れ、BrowsableAPIRenderer がこの API の Web インターフェイスを構築し、JSONRenderer が JSON レスポンスの構築を担当します。
perform_create メソッドを上書きすると、ユーザー作成メカニズムを制御できるようになります。ユーザー インスタントを作成し、is_active フィールドが False に設定されていることを確認してから、新しいユーザー モデルに接続される検証コード インスタントを作成して、最後に送信します。確認コードを記載した電子メールをユーザーに送信します。
電子メールを送信するには、設定ファイル内の電子メール フィールドを正しく構成する必要があります。この特定の点で問題がある場合は、別の記事を作成するためにお知らせください。
最後に、API URL を追加しましょう
from django.urls import path, include from .views import * urlpatterns = [ ]
app_account/urls.py
よし、試してみましょう
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('api/account/', include('app_account.urls')), ]
http://localhost:8555/api/account/register を開くと、次のようなものが表示されるはずです (これは BrowsableAPIRenderer によるものです)
必須フィールドはユーザー名、パスワード 1、パスワード 2 です。電子メールがユーザー名として使用されることが予想されます。
問題ないようです。検証コード モデルが接続されたユーザー モデルが作成されました (SQLite db ファイルを開くために SqlBrowser を使用しました)。ただし、デフォルトの応答はステータス 201 で次のようになります。
from django.db import models from django.contrib.auth.models import AbstractUser from datetime import timedelta, datetime class User(AbstractUser): userTypes = ( ('A', 'Admin'), ('C', 'Client'), ) role = models.CharField(max_length=1, choices=userTypes, default="C") hobbies = models.CharField(max_length=255, null=True, blank=True) job = models.CharField(max_length=100, null=True, blank=True) bio = models.TextField(null=True, blank=True) country_code = models.CharField(max_length=10, null=True, blank=True) expiration_date = models.DateTimeField(default=datetime.now()+timedelta(days=30))
すべての応答にこのスキーマを含めることを好みます
class AbstractUser(AbstractBaseUser, PermissionsMixin): username = models.CharField(...) first_name = models.CharField(...) last_name = models.CharField(...) email = models.EmailField(...) is_staff = models.BooleanField(...) is_active = models.BooleanField(...), date_joined = models.DateTimeField(...)
- ステータスは「成功」または「エラー」のいずれかである必要があります
- code は応答ステータスコード
- data は実際の応答データです
- メッセージにはエラー テキストまたはその他のメッセージが含まれている必要があります
しかし、どうやってそうするのでしょうか?
最善の方法は、カスタム JSON レンダラー 関数を実装することです。やってみよう
import random class VerificationCode(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) code = models.CharField(max_length=6, default=random.randint(111111, 999999)) email = models.EmailField() expiration_date = models.DateTimeField(default=datetime.now()+timedelta(days=1)) def __str__(self): return self.user.username
common/utils.py
JSONRenderer から継承して render メソッドを上書きしました。シリアライザのエラー。
- まず、応答ステータス コードを読み取り、それをコード フィールドに入力します
- そして、実際の応答データを応答スキーマのデータ フィールドに移動しました
- エラーと成功した応答を区別するために、ステータス コードをチェックします。ステータス コードが 200 ファミリの場合、成功応答です
- そうでない場合はエラーです。そのため、ステータスを「エラー」に変更し、応答の詳細フィールド (可能な場合) からエラー メッセージを抽出します。
- シリアライザーの検証エラーには詳細フィールドはなく、フィールド名 (キー) ごとにエラー メッセージ (値) を示す辞書であるため、単純な文字列に変換する小さな関数 dict2string を作成しました。さらに改善できると思いますが、ご協力いただけますか?
応答スキーマについてはこれで終わりです。今度はそれを使用してみましょう!
views.py で、カスタム レンダラをレジスタ ビュー クラスに追加します
from rest_framework import serializers from app_account.models import *
app_account/views.py
サーバーを実行し、http://localhost:8555/api/account/register/ を開くと、違いが直接表示されます
エラー メッセージにスキーマが表示されますか?、新しいユーザーを登録してみましょう。「test5@gmail.com」とします
うまくいきました。シリアライザー検証エラーをテストしてみましょう。同じユーザーを再度登録してみます
素晴らしいですね、これは検証エラー応答です。field:message としてシリアル化されました
登録後に何が起こるのですか?それは検証です
登録 ->メールを確認 ->ログイン ->何でも
アクティベーションAPI
ユーザーが登録時に送信したアクティベーション コードを受け取ったかどうかを確認したいと考えています。ユーザーが正しいコードを送信した場合、アカウントをアクティベートします。そうでない場合は、再度確認するよう依頼します。コードを再送信します (後で使用する別の API)
登録 API の作成プロセスと同様に、シリアライザーから始めましょう
from django.urls import path, include from .views import * urlpatterns = [ ]
これは特定のデータベース モデルに関連していないため、汎用シリアライザーから継承しています。シリアライザーはフォームに似ているので、フィールドとその検証ルールを設定することに注意してください。
ユーザーの電子メール アドレスであるユーザー名とコードの 2 つの文字列フィールド (CharField) を使用しています。両方とも必須です。
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('api/account/', include('app_account.urls')), ]
app_account/views.py
カスタム API ビューを使用しているため、APIView から継承しており、5 つの関数 (get、post、put、delete、patch) を提供しています。 POST リクエストからのリクエスト データを逆シリアル化し、そのタイプを検証してから、提供されたデータが存在するかどうかを確認するクエリを作成します。データが存在する場合は、ユーザーをアクティブ化し、そのテーブルからコード オブジェクトを削除します。そうでない場合は、「invalid_code」であることを示すエラー メッセージが送信されます。最後に、このビューの URL を含めるように URL ファイルを更新する必要があります
from rest_framework import serializers from app_account.models import *
app_account/urls.py
これで、URL http://localhost:8555/api/account/activate/ を開くことができます。カスタム API ビューを使用しているため、必須フィールドは取得されません
データベースからコードを取得できます (テスト目的)。リクエストは次のようになります
from django.urls import path, include from .views import * urlpatterns = [ ]
すべてが正常に完了した場合、応答は次のようになります
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('api/account/', include('app_account.urls')), ]
以上です
最後にまとめましょう!まだログインしていないのですが、本当に長い記事になってしまいましたので、続きは次の記事にいきましょう
乞うご期待?
以上がDjango アカウント管理アプリ (登録とアクティベーション)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









