前の記事でプロジェクトの骨格構造を作成しました。この記事はそれに基づいて構築します。それはカバーします
読者を飽きさせないように、できるだけ多くの詳細を説明するよう努めますが、Python と Django のいくつかの側面についてはよく知っていることを期待しています。
ソース コードの最終バージョンは https://github.com/saad4software/alive-diary-backend にあります
興味があれば過去の記事をチェックしてください!
アプリでシリアライザー ファイルを作成しましょう
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(...)
最も重要なものは次のとおりです:
このプロジェクト ユーザー用に複数のフィールドも追加しました。
アカウントのアクティベーション、パスワードの忘れ、コードの再送信のための確認コードを保存および追跡するための確認コード モデルも必要です。
from rest_framework import serializers from app_account.models import *
app_account/models.py
Userモデルと接続し、6桁のコード番号のランダムな値を生成します。有効期限も 24 時間です。ユーザーが複数の電子メール アドレスを検証したい場合に備えて、電子メール ファイルも用意されていますが、これはまれであり、このアプリでは削除できます。次にシリアライザーに移りましょう。
シリアライザーから始めましょう
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(...)
しかし、どうやってそうするのでしょうか?
最善の方法は、カスタム 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 メソッドを上書きしました。シリアライザのエラー。
応答スキーマについてはこれで終わりです。今度はそれを使用してみましょう!
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 の作成プロセスと同様に、シリアライザーから始めましょう
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 サイトの他の関連記事を参照してください。