😎

Django REST Frameworkを使用した簡易的なアカウント機能の実装

2023/07/23に公開

この記事は何??🧐

この記事では、Django REST Frameworkを使用して簡易的なアカウント機能を実装する手順を詳しく解説します。ユーザー登録やログイン、ユーザー情報の取得や更新、そしてアカウントの削除といった機能をカバーし、セキュアなアカウント管理システムを簡単に構築できるようになります。

目次

1.はじめに

  • Django REST Framework(DRF)の簡単な説明

2.プロジェクトのセットアップ

  • Djangoプロジェクトとアプリの作成方法の説明
  • DRFのインストールとDjangoプロジェクトへの組み込み方
  • データベースの設定とマイグレーションの実行方法

3.アカウント認証の実装

  • 新規登録機能
  • ログイン機能
  • ユーザー情報取得
  • ユーザー情報更新機能
  • アカウント削除機能

4.最後に

  • 簡易的なアカウント機能の実装に対する感想と振り返り

1.はじめに

最初にお伝えしますが、この記事は私自身が初めて投稿するものであり、分かりにくい部分もあるかもしれませんが、なるべくわかりやすく書くように努力します🤓

なぜこの記事を投稿することにしたのかというと、Django REST Frameworkに関する情報が私の個人的には少なすぎると感じたからです!

他の言語の情報に比べても情報量が不足していると感じ、その中で私が直面した課題や克服した方法を共有したいと思い、この記事を執筆しました。

私自身もあまり知識が豊富ではありませんが最大限の努力は致します!

この記事では、Django REST Frameworkについての基本的な概要から始め、具体的なアカウント認証機能の実装に進んでいきます。初心者向けにわかりやすく解説することを心がけていますので、DjangoやRESTful APIに馴染みがない方でも理解できるように説明します!

以上のように、初心者から経験者まで、広い層の方々に価値ある情報を提供できるように努めます。どうぞよろしくお願いいたします!もし何か質問があればお気軽にお知らせくださいね。

Django REST Framework(DRF)の簡単な説明

Django REST Framework(DRF)は、PythonウェブフレームワークであるDjangoを補完する形で開発された、強力なRESTful APIフレームワークです。

DRFは、Djangoをベースにしているため、Djangoの機能と特性を活用しながら、APIの作成や管理を簡単に行うことができます。RESTfulなAPIを構築するために必要な機能やツールを提供し、開発者が効率的にAPIを実装できるように設計されています。

Djangoを基盤にしているため、Djangoの機能と連携して効率的にAPIを開発できる上に、ドキュメントも充実しているため、API開発のプロセスを簡素化することができます。RESTfulなAPIを簡単に実装したい場合や、セキュリティと柔軟性に重点を置いたAPI開発に適しています。

DRFを使うことによって、DRFで作ったAPIをフロントと繋いでTypescriptやFlutterなどのフロントエンドと連携してアプリを作ることができます!!

それでは実際に作ってみましょう🫡

めんどくさかったら下記にコードを載せておくのでコピペしてください!!

https://github.com/Iccyan21/AccountApi

プロジェクトのセットアップ

Djangoプロジェクトとアプリの作成方法の説明

PythonやDjangoなどの環境は、installされているものとして話を進めていきます
まずはDjangoのプロジェクトを作成してみましょう!

下記はMacでのDjango プロジェクト作成コマンドです

django-admin startproject mysite 

これでmysiteという名のプロジェクトファイルが作成されます。もしプロジェクトファイル名を変更する場合は、適宜指定してください

プロジェクトが作成されたらVscodeでも何でもいいのでエデイタからプロジェクトファイルを開きましょう

開かれましたら、上記の写真のようにプロジェクトが作成されていますので、一度異常がないかターミナルからサーバーが立ち上がるか下記のコマンドを入力し見てみましょう!

python manage.py runserver 

サーバーが立ち上がると

Django version 4.2.2, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C. 

このような文字が出力されますのでhttp://127.0.0.1:8000/ のところをcommandを押しながら
クリックしてみましょう! すると

このような画面が出てくれば成功しているので大丈夫です!

補足

サーバーを立ち上げるときに赤い文字で

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

このメッセージはDatabaseに関するマイグレーションが行われていないことを示していますが、後でDatabaseの設定を行う際にこの問題は解消されますので、ご安心ください。

ってことで今からアプリを作成しましょう!下記のコマンドをターミナルで入力してね

python manage.py startapp accounts

上記のコマンドが成功すると下記のような状態になります

accountsファイルが作成されたら成功したと言えるでしょう!

それでは必要なものをインストールしていきましょう!

DRFのインストールとDjangoプロジェクトへの組み込み方

まずは必要なものをインストールしましょう!
最初にこの記事の主役であるdjangorestframeworkをインストールしましょう
ターミナルで以下のコマンドを入力してください

pip install djangorestframework

インストールが終了したらmysiteファイルにある、settings.pyのINSTALLED_APPSにさっき作ったアプリとDRFを追加しましょう。上の方にあります。

INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "accounts", #作ったアプリを追加
    "rest_framework", #DRFを追加(さっきインストールしたやつ)
]

そしてsettings.pyの下部にあるLANGUAGE_CODEとTIME_ZONEも変更しましょう

# 変更前
LANGUAGE_CODE = "en-us"

TIME_ZONE = "UTC"
# 変更後
LANGUAGE_CODE = "ja"

TIME_ZONE = "Asia/Tokyo"

上記の変更後に書き換えましょう!!

そして管理ユーザーも作りましょう。ターミナルに以下のコマンドを入力

python manage.py createsuperuser

UserIDとPasswordは忘れないように😤
管理ユーザーが作成できたら一度、管理画面に行きましょう

python manage.py runserver

上記写真のURLにhttp://127.0.0.1:8000/admin と入力しEnterすると

このような画面が出てきますので先ほど入力したUserIDとPasswordを入力しログイン

この画面が出てこればログイン成功です!
この画面が管理ページとなります。Databaseの変更であったりなどがここでできます。

ここではinclude関数を使用して、accountsアプリのルーティング設定をmysiteプロジェクトのURLに追加しています。accountsアプリのURL設定はaccounts/urls.pyファイルで行います。

この設定により、mysite/accounts/以下のURLにアクセスした場合には、accountsアプリのURL設定が適用されます。

それではDataBaseの設定にいきましょう

データベースの設定とマイグレーションの実行方法

今からはaccountsファイルを主に動かしていきます。mysiteファイルは設定のファイルなので基本的に触らないです。

accountにあるmodels.pyにアカウントのモデルを追加していきます.

class User(models.Model):
    user_id = models.CharField(max_length=20, unique=True)
    password = models.CharField(max_length=20)
    nickname = models.CharField(max_length=50)
    comment = models.CharField(max_length=100, blank=True)
    
    def __str__(self):
        return self.user_id

ここで、Userモデルはuser_id、password、nickname、commentという4つのフィールドを持っています。user_idフィールドはユニークな値(他のユーザーと同じuser_idにはできない)を持ち、passwordフィールドは20文字までのパスワードを格納します。また、commentフィールドは空白でも良いようにblank=Trueとしています。

これにより、アカウントの情報をデータベースに格納できるようになりました。次に、データベースにこのモデルを反映させるためにマイグレーションを行う必要があります。

Djangoの場合、Databaseの作成、変更をすると絶対にマイグレーションを行う必要があります。
なのでDatabeseを作成したのでマイグレーションを行いましょう!!

python manage.py makemigrations

上記のコマンドで新規にDatabaseが作成され

Migrations for 'accounts':
  accounts/migrations/0001_initial.py
    - Create model User

このように出力されれば大丈夫です

次にDatabaseをmigrateしましょう!!

python manage.py migrate

上記のコマンドでDatabaseが確定されます

Operations to perform:
  Apply all migrations: accounts, admin, auth, contenttypes, sessions
Running migrations:
  Applying accounts.0001_initial... OK
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

このようなコマンドが出れば大丈夫でしょう!!

これでDatabaseの設定は終了です。

次には実際にコードを書いてみましょう👍

アカウント認証の実装

新規登録機能

今から本格的にコードを書いてみましょう、accountsファイルからserializers.pyを作成
一番左のやつ

作成ができたら、serializers.pyに新規登録をするときのSerializerを書きましょう

from rest_framework import serializers
from .models import User

class RegisterSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('user_id', 'password', 'nickname')
        extra_kwargs = {'password': {'write_only': True}}

        def create(self, validated_data):
            user = User.objects.create_user(**validated_data)
            return user

ここで、RegisterSerializerはUserモデルをベースにしており、user_id、password、nicknameの3つのフィールドを指定しています。また、passwordフィールドはwrite_only=Trueとして、新規登録時にはパスワードを表示しないように設定しています。

createメソッドでは、新しいユーザーをUser.objects.create_userを使用して作成し、データベースに保存しています。このシリアライザを使用することで、新規登録時に必要な情報をバリデーションしてユーザーを作成することができます。

続いてはviews.pyに続きを書いていきましょう


class RegisterView(APIView):
    @staticmethod
    def post(request, *args, **kwargs):
        print(request.data)
        serializer = RegisterSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            # パスワードと確認パスワードが一致しない場合
            if serializer.validated_data['password'] != request.data['password_confirmation']:
                return Response({'error': 2}, status=HTTP_400_BAD_REQUEST)

            # UserIDがすでに使われていた場合
            if User.objects.filter(user_id=serializer.validated_data['user_id']).exists():
                return Response({'error': 3}, status=HTTP_400_BAD_REQUEST)

            # エラーなし
            try:
                serializer.save()
            except:
                # データベースエラー
                return Response({'error': 11}, status=HTTP_500_INTERNAL_SERVER_ERROR)

            return Response(serializer.data, status=HTTP_201_CREATED)
        return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)

上記が新規作成のviews.pyです。

ここではRegisterViewクラスを定義し、POSTリクエストを受け取るメソッドを実装しています。リクエストされたデータをRegisterSerializerでバリデーションし、入力された情報に問題がなければ新しいユーザーを作成しています。

新規登録時に行っているチェックは以下の通りです:

パスワードと確認パスワードが一致しているかどうかのチェック
すでに使用されているUserIDかどうかのチェック
エラーがなければユーザーをデータベースに保存し、成功したらステータスコード201を返します。エラーがある場合は適切なステータスコードを返すことで、クライアント側が適切にエラーを処理できるようになっています。

mysiteのurls.pyに以下を記入しましょう

from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path("admin/", admin.site.urls), # 管理画面
    path("accounts/", include("accounts.urls")), #accountsのurl
]

そして最後にaccountsファイルにurls.pyを作成しその中に以下の文を追加

from . import views
from django.urls import path, include


urlpatterns = [
    path('sighup/', views.RegisterView.as_view(), name='user-signup'), # 新規登録処理'
]

admin.pyに追加

from django.contrib import admin
from .models import User

admin.site.register(User)

それでは実際に新規登録ができるかみてみましょう。

python manage.py runserver

サーバーを起動させたらURLにhttp://127.0.0.1:8000/accounts/sighup/ を入力すると

この画面が出てきますので

このようにDataを入力しPOSTボタンを押してみましょう。

成功すればこのような画面が表示され201が表示されているので作成できたことがわかります

また、ターミナルにも新規登録されたデータが表示されることを確認できます。

これで新規登録の処理の実装は終了です

ログイン機能

続いてはログイン機能の実装についてです。

まず最初にmodels.pyに以下のことを追加しましょう

from django.db import models
import hashlib
from datetime import timedelta
from django.utils import timezone
    
def in_30_days():
    return timezone.now() + timedelta(days=30)

class AccessToken(models.Model):
    # ひもづくユーザー
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    # アクセストークン(max_lengthが40に設定されている理由は、トークンはsha1でハッシュ化した文字列を設定するため)
    token = models.CharField(max_length=40)
    # アクセス日時
    access_datetime = models.DateTimeField(default=in_30_days)

    def str(self):
        # メールアドレスとアクセス日時、トークンが見えるように設定
        dt = timezone.localtime(self.access_datetime).strftime("%Y/%m/%d %H:%M:%S")
        return self.user.user_id + '(' + dt + ') - ' + self.token

    @staticmethod
    def create(user: User):
        # ユーザの既存のトークンを取得
        if AccessToken.objects.filter(user=user).exists():
            # トークンがすでに存在している場合は削除
            AccessToken.objects.get(user=user).delete()

        # トークン作成(UserID + Password + システム日付のハッシュ値とする)
        dt = timezone.now()
        str = user.user_id + user.password + dt.strftime('%Y%m%d%H%M%S%f')
        hash = hashlib.sha1(str.encode('utf-8')).hexdigest()

        # トークンをDBに追加
        token = AccessToken.objects.create(
            user=user,
            token=hash,
            access_datetime=dt)

        return token

AccessTokenモデルは、ユーザーとアクセストークンを関連付けるためのものです。userフィールドにはForeignKeyを使用してUserモデルと関連付けています。

createメソッドは、新しいアクセストークンを作成するためのメソッドです。ユーザーが新しいアクセストークンを要求するたびに、古いトークンは削除され、新しいトークンが作成されます。トークンはUserID、パスワード、システム日付を組み合わせてハッシュ化しています。

Databaseを追加したので

 python manage.py makemigrations
 python manage.py migrate 

こちらをお忘れなく🫡

accountsファイルからserializers.pyに下記のことを追加しましょう

class LoginSerializer(serializers.Serializer):
    user_id = serializers.CharField(max_length=255, write_only=True)
    password = serializers.CharField(write_only=True, style={'input_type': 'password'})
    def validate(self, data):
        user_id = data.get('user_id')
        password = data.get('password')
        userid = User.objects.get(user_id=user_id)
        re_password = User.objects.get(password=password)
        if user_id == userid.user_id:
            if password == re_password.password:
                return data

            else:
                raise serializers.ValidationError('ログイン失敗')

ここでLoginSerializerでは、user_idとpasswordをバリデーションしています。user_idでユーザーを検索し、対応するユーザーがデータベースに存在するかをチェックします。ユーザーが存在しない場合は、raise serializers.ValidationError('ユーザーが存在しません')でエラーを返します。

パスワードの検証はcheck_password()メソッドを使用して行っています。入力されたパスワードがユーザーの実際のパスワードと一致しない場合は、raise serializers.ValidationError('パスワードが間違っています')でエラーを返します。

これにより、LoginSerializerがログイン時のデータバリデーションを行うようになりました。

続いてviews.pyです

from .serializers import RegisterSerializer,LoginSerializer
from rest_framework.response import Response
from rest_framework.status import HTTP_200_OK, HTTP_201_CREATED, HTTP_400_BAD_REQUEST, HTTP_404_NOT_FOUND, HTTP_500_INTERNAL_SERVER_ERROR
from rest_framework.generics import GenericAPIView
from rest_framework.views import APIView
from .models import  User, AccessToken
from rest_framework.viewsets import ModelViewSet
from rest_framework.permissions import AllowAny

class LoginView(GenericAPIView):
    """ログインAPIクラス"""
    permission_classes = [AllowAny]
    serializer_class = LoginSerializer

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            user = User.objects.get(user_id=serializer.validated_data["user_id"])
            user_id = serializer.validated_data['user_id']
            token = AccessToken.create(user)
            return Response({'detail': "ログインが成功しました。", 'error': 0, 'token': token.token, 'user_id': user_id})
        return Response({'error': 1}, status=HTTP_400_BAD_REQUEST)

ここでLoginViewはGenericAPIViewを継承しており、ログイン機能の実装を行っています。

postメソッドでは、送信されたデータをバリデーションするためにLoginSerializerを使用しています。バリデーションに成功した場合、serializer.validated_data['user_id']でログインに使用されたユーザーIDを取得し、それを元に対応するUserオブジェクトをデータベースから取得します。

その後、AccessToken.create(user)を呼び出して、AccessTokenモデルを使用してユーザーに新しいアクセストークンを作成します。

ログインが成功した場合は、Responseオブジェクトを返して、ログインが成功し、発行されたトークンとユーザーIDがクライアント側に返されるようになっています。

続いてはurls.pyに

from . import views
from django.urls import path, include


urlpatterns = [
    path('sighup/', views.RegisterView.as_view(), name='user-signup'), # 新規登録処理'
    path('login/', views.LoginView.as_view(), name='user-login'), # ログイン処理(追加)
]

を記入し実際に動くか試しましょう🫠
ターミナルから

python manage.py runserver

起動させたら
http://127.0.0.1:8000/accounts/login/

このように入力しPOSTボタンを押しましょう。すると

"HTTP 200 OK"のレスポンスが返ってきたことから、ログインが成功し、トークンが発行されたことが分かります。

これでログイン処理が正常に終了しました!

これでログイン処理は終わりです。

今で半分の処理が終わりました!!

ここまできた自分を褒めてやってください

ユーザー情報取得

続いてはユーザー情報取得の処理ですまずはviews.pyから

class UserDetailView(APIView):
    def get(self, request, user_id):
        # ユーザ情報の取得
        user = User.objects.filter(user_id=user_id).first()

        if not user:
            # ユーザが存在しない場合
            return Response({"message": "No User found"}, status=404)

        response_data = {
            "message": "User details by user_id",
            "user": {
                "user_id": user.user_id,
                "nickname": user.nickname,
                "comment": user.comment
            }
        }

        return Response(response_data, status=200)

UserDetailViewクラスはAPIViewを継承しており、GETリクエストを処理するためのものです。

getメソッドでは、与えられたuser_idをもとにUserオブジェクトをデータベースから取得します。もしユーザーが存在しない場合は、HTTPステータスコード404(HTTP_404_NOT_FOUND)を返します。

ユーザーが存在する場合は、Responseオブジェクトを使ってJSON形式のレスポンスを返します。ユーザー情報がresponse_dataに格納され、レスポンスのステータスコードは200に設定されます。

そしてurls.pyに

 urlpatterns = [
    path('sighup/', views.RegisterView.as_view(), name='user-signup'), # 新規登録処理'
    path('login/', views.LoginView.as_view(), name='user-login'), # ログイン処理
    path('users/<str:user_id>/', views.UserDetailView.as_view(), name='user-detail'), # ユーザ情報取得
]

を記入し実際に動くか試しましょう🫠
ターミナルから

python manage.py runserver

URLにhttp://127.0.0.1:8000/accounts/users/OdaNobunaga/ を入力すると

このように指定したユーザーID のユーザー情報が取得できています。

これでユーザー情報の取得の実装は終わりです

今で半分の処理が終わりました!!

ここまできた自分を褒めてやってください👍

ユーザー情報更新

続いてはユーザー情報更新処理です。serializers,pyに以下を追加します。

class UserUpdateSerializer(serializers.Serializer):
    nickname = serializers.CharField(max_length=30, allow_blank=True)
    comment = serializers.CharField(max_length=100, allow_blank=True)

    def update(self, instance, validated_data):
        instance.nickname = validated_data.get('nickname', instance.nickname)
        instance.comment = validated_data.get('comment', instance.comment)
        instance.save()
        return instance

UserUpdateSerializerクラスはserializers.Serializerを継承しており、nicknameとcommentの2つのフィールドを持っています。それぞれのフィールドは、更新する際に空欄を許容するようにallow_blank=Trueが設定されています。

updateメソッドは、ユーザー情報の更新処理を実装しています。引数として、更新対象のインスタンスと入力されたデータ(validated_data)を受け取ります。validated_dataには、バリデーションが通過したユーザーの新しいニックネームとコメントが含まれています。

updateメソッドでは、受け取ったデータでインスタンスのフィールドを更新し、saveメソッドで変更をデータベースに保存します。最後に更新されたインスタンスを返します。

これでユーザー情報更新のためのUserUpdateSerializerが準備できました!次に、views.pyで更新処理を実装していきましょう。

下記はviews.py

class UserUpdateView(APIView):
    def patch(self, request, user_id):
        # ユーザ情報の取得
        user = User.objects.filter(user_id=user_id).first()

        if not user:
            # ユーザが存在しない場合
            return Response({"message": "No User found"}, status=404)

        if user_id != user.user_id:
            # 認証と異なるIDのユーザを指定した場合
            return Response({"message": "No Permission for Update"}, status=403)

        serializer = UserUpdateSerializer(user, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()

            response_data = {
                "message": "User successfully updated",
                "user": {
                    "nickname": user.nickname,
                    "comment": user.comment
                }
            }
            return Response(response_data, status=200)
        else:
            error_message = serializer.errors.get('non_field_errors', ['User updation failed'])[0]
            return Response({"message": "User updation failed", "cause": error_message}, status=400)

    def post(self, request, user_id):
        return Response({"message": "Method not allowed"}, status=405)

UserUpdateViewクラスはAPIViewを継承しており、patchメソッドをオーバーライドしています。patchメソッドはHTTP PATCHメソッドを使用して部分更新を行います。

patchメソッドでは、指定されたuser_idに対応するユーザー情報を取得し、存在しない場合や認証が異なる場合には適切なエラーレスポンスを返します。

UserUpdateSerializerを使って入力データのバリデーションとユーザー情報の更新を行います。バリデーションが成功し、ユーザー情報が更新された場合は、更新されたユーザー情報を含む成功レスポンスを返します。

これでユーザー情報の更新処理が実装されました!次に、urls.pyにURLパターンを追加して更新処理を有効にしましょう。

from . import views
from django.urls import path, include


urlpatterns = [
    path('sighup/', views.RegisterView.as_view(), name='user-signup'), # 新規登録処理'
    path('login/', views.LoginView.as_view(), name='user-login'), # ログイン処理
    path('users/<str:user_id>/', views.UserDetailView.as_view(), name='user-detail'), # ユーザ情報取得
    path('users/<str:user_id>/update/', views.UserUpdateView.as_view(), name='user-update'), # ユーザ情報更新
]

を記入し実際に動くか試しましょう🫠
ターミナルから

python manage.py runserver

サーバーを起動させたらURLにhttp://127.0.0.1:8000/accounts/users/OdaNobunaga/update/
を記入し

この画面が出てくるので今度はPOSTではなく下の

ここでPATCHボタンを押します。すると

このように更新されます。

これでアカウント更新の処理は終わりです。

最後はアカウント削除機能です

アカウント削除機能

まずはviews.pyに


class CloseAccountView(APIView):
    def post(self, request,user_id):
        ## アカウントの削除処理
        try:
            user = User.objects.filter(user_id=user_id).first()
            user.delete()
        except User.DoesNotExist:
            raise Response("No User found")

        return Response({"message": "Account and user successfully removed"}, status=200)
        

まず、postメソッドでHTTPのPOSTリクエストを受け取っています。アカウントの削除は重要な操作なので、HTTPメソッドはPOSTを使用しています。また、user_idという引数も受け取っています。これは削除対象のユーザーのIDを指定するためのものです。

次に、tryブロック内で指定されたuser_idを持つユーザーをデータベースから取得しています。User.objects.filter(user_id=user_id).first()は、指定されたuser_idに対応するユーザーをデータベースから検索し、最初に見つかったユーザーを取得するメソッドです。もしユーザーが見つからない場合はUser.DoesNotExist例外が発生します。

そして、user.delete()を呼び出してユーザーをデータベースから削除しています。

最後に、削除が成功した場合はResponseオブジェクトを使ってJSON形式のレスポンスを返しています。{"message": "Account and user successfully removed"}というメッセージが返されます。

そしてurls.py


from . import views
from django.urls import path, include


urlpatterns = [
    path('sighup/', views.RegisterView.as_view(), name='user-signup'), # 新規登録処理'
    path('login/', views.LoginView.as_view(), name='user-login'), # ログイン処理
    path('users/<str:user_id>/', views.UserDetailView.as_view(), name='user-detail'), # ユーザ情報取得
    path('users/<str:user_id>/update/', views.UserUpdateView.as_view(), name='user-update'), # ユーザ情報更新
    path('close/<str:user_id>/', views.CloseAccountView.as_view(), name='close-account'), # アカウント削除 追加
]
        

を記入し実際に動くか試しましょう🫠
ターミナルから

python manage.py runserver

そしてURLにhttp://127.0.0.1:8000/accounts/delete/OdaNobunaga/ を記入し

上記の画面が作成されます

そして消去するuser_id を記入しPOSTを押すと

このような画面の表示が出てくればアカウントさ正式に削除されてるでしょう!!!

管理画面にもアカウントは残っておりません!!

これでアカウント削除の処理は終わりです。

これで全てのアカウント認証周りの実装が終わりました。お疲れ様でした。ここまできた自分を褒めてやってください🙌

簡易的なアカウント機能の実装に対する感想と振り返り

これでDjango REST Frameworkによるアカウント認証周りの実装は終了となります

特に後半は睡魔に襲われながら書いていたので確認しましたが間違ってるかもしれません😱

もしわからないところがあれば気軽に質問してください!!

下記にGitのコードを載せておくので、参考程度に拝見ください!

https://github.com/Iccyan21/AccountApi

こちらがtwitterアカウントなのでよければフォローお願いします!!

https://twitter.com/GIANT_KILLING_0

最後まで拝見いただき、ありがとうございました!!

Discussion