View on GitHub

ユーザビューの実装

Home

ユーザビューの実装

パッケージのインストール

(recsys_full) backend$ pip install djangorestframework
(recsys_full) backend$ pip install django-filter
(recsys_full) backend$ pip freeze
...(略)...
django-filter==25.1
djangorestframework==3.16.0
...(略)...

アプリケーションの登録

backend/config/settings/base.py

......
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'api.online.apps.OnlineConfig',
    'corsheaders',
    'rest_framework',  # <- 追加
    'django_filters',  # <- 追加
]
......

マッパー

backend/api/online/mappers.py

class UserMapper:
    def __init__(self, obj):
        self.obj = obj

    def as_dict(self):
        user = self.obj
        return {
            'id': user.id,
            'email': user.get_email(),
        }

ビュー

backend/api/online/views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import User
from .mappers import UserMapper
from .utils import hash
import uuid


class UsersView(APIView):
    """ユーザビュークラス
    """
    def get(self, request, format=None):
        """ユーザを取得する。
        
        Requests
        --------
        email : str
            emailアドレス

        Response
        --------
        user : json
            ユーザ
        """
        # リクエストパラメタの取得
        email = request.GET.get('email')
        if not email:
            return Response(None, status.HTTP_401_UNAUTHORIZED)
        email_hash = hash(email)
        
        # オブジェクトの取得
        users = User.objects.filter(email_hash=email_hash)

        # レスポンス
        users_dict = [UserMapper(user).as_dict() for user in users]
        data = {
            'users': users_dict,
        }
        return Response(data, status.HTTP_200_OK)

    def post(self, request, format=None):
        """ユーザを登録する。

        Requests
        --------
        email : str
            emailアドレス

        Response
        --------
        user : json
            ユーザ
        """
        # リクエストパラメタの取得
        email = request.data['email']

        # オブジェクトの登録
        id = str(uuid.uuid4())
        user = User(id=id)
        user.set_email(email)
        user.save()

        # レスポンス
        user_dict = UserMapper(user).as_dict()
        data = {
            'user': user_dict,
        }
        return Response(data, status.HTTP_201_CREATED)

URLマッピング

backend/api/online/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('users/', views.UsersView.as_view()),
]

backend/config/urls.py

from django.contrib import admin
from django.urls import path, include  # <- includeを追加

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/online/', include('api.online.urls')),  # <- 追加
]

バックエンドサーバが起動している状態で、ブラウザで下記URLにアクセスしてください。

Contentフォームに、例えば下記のデータを入力し、POSTボタンをクリックしてください。

{
  "email": "user000@rsl.org"
}

usersテーブルに下記のようにユーザデータが登録されました。

recsys_full=# SELECT * FROM users ;
     id     |      email_encrypted      |        email_hash         
------------+---------------------------+---------------------------
 【ユーザID】 | 【暗号化されたemailアドレス】 | 【emailアドレスのハッシュ値】 
(1 row)

ブラウザで下記URLにアクセスしてください。

下記のように、登録したユーザの情報が取得できます。

{
    "users": [
        {
            "id": "【ユーザID】 ",
            "email": "user000@rsl.org"
        }
    ]
}

参考

  1. 横瀬明仁,『現場で使える Django の教科書《基礎編》』,2018.
    • 4.3.3 モデルオブジェクトを dict に変換する