ユーザビューの実装
パッケージのインストール
(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"
}
]
}
参考
- 横瀬明仁,『現場で使える Django の教科書《基礎編》』,2018.
- 4.3.3 モデルオブジェクトを dict に変換する