ホームページ >バックエンド開発 >Python チュートリアル >Django アカウント管理アプリ (登録とアクティベーション)

Django アカウント管理アプリ (登録とアクティベーション)

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-04 21:57:021040ブラウズ

この記事から何を期待できるでしょうか?

前の記事でプロジェクトの骨格構造を作成しました。この記事はそれに基づいて構築します。それはカバーします

  • ユーザーと確認コードを含むアカウント データベース構造。
  • シリアライザーをモデル化します。
  • アカウントの登録、アクティブ化のためのアカウント ビュー。次の記事では、ログイン、トークンの更新、パスワードの変更、パスワードの忘れ、コードの再送信など、残りのビューについて説明します。

読者を飽きさせないように、できるだけ多くの詳細を説明するよう努めますが、Python と Django のいくつかの側面についてはよく知っていることを期待しています。

ソース コードの最終バージョンは https://github.com/saad4software/alive-diary-backend にあります

シリーズの順序

興味があれば過去の記事をチェックしてください!

  1. ゼロから作る AI プロジェクト、アイデア、生きた日記
  2. Google AI Studio で実現可能であることを証明してください
  3. Django API プロジェクトのセットアップ
  4. 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 によるものです)

Django accounts management app ( registration and activation

必須フィールドはユーザー名、パスワード 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/ を開くと、違いが直接表示されます

Django accounts management app ( registration and activation

エラー メッセージにスキーマが表示されますか?、新しいユーザーを登録してみましょう。「test5@gmail.com」とします

Django accounts management app ( registration and activation

うまくいきました。シリアライザー検証エラーをテストしてみましょう。同じユーザーを再度登録してみます

Django accounts management app ( registration and activation

素晴らしいですね、これは検証エラー応答です。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 ビューを使用しているため、必須フィールドは取得されません

Django accounts management app ( registration and activation

データベースからコードを取得できます (テスト目的)。リクエストは次のようになります

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。