DRF+Reactを使用した類似開発(blog)(5)ユーザモデルシーケンサ、ビュー作成+Urls接続の作成
以前の文章では,著者らは掲示板に関連するpostに関連するコードを記述した.この記事では、accountディレクトリで動作するUser modelのコードを作成します.
models.py
UserViewSet
UserViewSetは一般的なModelViewSetなのでスキップ
LoginView
前の記事でも言ったように、viewはコントローラの役割であり、論理的に実現される場所です.したがって、Login機能はLoginViewによって実行される.postを上書きする理由は、LoginがPOSTメソッドを使用してリクエストを受信するためである.
シーケンサは、前に作成したLoginSerializerを使用してデータを転送します. serializer.is valid(rais exception=True)を実行します.この関数はserializerのvalidateを実行し、エラーがある場合は停止し、ない場合は続行します. このローが実行されると、is validが通過するため、作成したperform loginによってloginが実行されます. は、の結果を返します. LogoutView
これは、ログアウトを簡単に実行するビューです.postは上書きされますが、内部ではログアウトさせるだけです. urls.py
models.py
Djangoは基本的にUser modelを提供しており、このUserモデルを使用します.したがって、特に追加したいものがなければ、モデルコードを書く必要はありません.
serializers.py
シーケンス化器で記述されるコードは、基本モデルではなく少し増加します.まず,前述したように,Userモデルにシーケンス化器を記述する.
UserSerializer
from rest_framework import serializers
from django.contrib.auth.models import User
class UserSerializer(serializers.ModelSerializer):
confirm = serializers.CharField(max_length=100, write_only=True)
email = serializers.EmailField(required=True)
class Meta:
model = User
fields = ['id', 'username', 'password', 'email', 'confirm']
これは優先的に作成された内容です.通常のModelSerializerのように見え、ユーザーのCRUD操作に使用されます.ここで確認フィールドは確認パスワードとして扱われます.optionではwrite only=trueが付加されています.これは、データストレージではなく会員登録にのみ使用されるためです.
write only=Trueは入力値ですが、DBには格納されません.反対のオプションはread only=trueです.
掲示板関連のSerializerについては,この程度でコードは終了しているが,Userについては,作成するコードが残っている.
次はvalidate関数を上書きする必要があります.def validate(self, data):
if data['password'] != data['confirm']:
raise serializers.ValidationError('비밀번호와 비밀번호 확인이 일치하지 않습니다')
return data
前の記事ではほんの一部しか言及していませんが、serializerの機能の核心機能はinputを検証することです.入力したデータが論理に合っているかどうかを確認します.
したがって、以上のコードは「confirm」フィールドを入力するとき!passwordと異なる場合はerrorが生成されます.そうでない場合は、デフォルトの設計に従ってデータが返されます.
ここで基本的なデザインを見たい場合は、ここです。を参照してください.
次にcreateとupdate functionを上書きする必要があります.この2つの関数は、すべてのserializerのデフォルトロジックです.基本的な実装の構成は次のとおりです.
1. serializer.save()メソッドが実行されます.
2.create()またはupdate()は、インスタンスが存在するかどうかを示します.
3.したがって、新しいオブジェクトが作成されるか、指定されたインスタンスが入力されたデータに更新されます.def create(self, validated_data):
validated_data.pop('confirm')
user = User.objects.create(**validated_data)
user.set_password(validated_data['password'])
user.save()
return user
def update(self, instance, validated_data):
instance.username = validated_data['username']
instance.password = validated_data['password']
instance.email = validated_data['email']
instance.save()
return instance
これは非常に簡潔で分かりやすいコードです.createの場合、データを確認する必要はありませんので、削除後、残りのvalidate dataを使用して新しいUser objectを作成します.ここでvalidate dataは、前に書いたvalidate関数でデータを入力します!
また、passwordを単独で追加する理由は、Djangoが提供するUser modelがpasswordを単独で追加する必要があるためである.(経験は私たちに...詳細な原因は正式なドキュメントで見つけることができることを教えてくれます.)とにかくパスワードを単独で注入したのでuser()を保存してユーザーに戻ります.
updateの場合は、データを再更新するだけです.
LoginSerializer
ModelSerializerではなく、最初のSerializerです.このシーケンス化器はloginに使用されます.またlogin用のシーケンス化器を作成するのは、要求するデータの形式が異なる、すなわち受信するデータのフォーマットが異なるためである.最終的に、任意のデータがバックエンドで使用される場合、シーケンス化器が必要であると容易に考えられる.そこでloginのシーケンス化器を作成しますfrom django.contrib.auth import authenticate, login
class loginSerializer(serializers.Serializer):
username = serializers.Charfield(max_length=100, required=True)
passwod = serializers.Charfield(max_length=100, required=True)
def validate(self, data):
user = authenticate(username=data['username'], password=data['password'])
if user is None:
raise serializers.ValidationError('아이디 혹은 비밀번호가 잘못되었습니다')
return data
def perform_login(self, request):
user = authenticate(username=request.data['username'], password=request.data['password'])
login(request, user)
return user
まずauthenticateとloginをインポートします.authenticateで、ユーザー名とパスワードを入力し、ユーザーが存在する場合はユーザーオブジェクトを返し、存在しない場合はNoneを返します.loginの場合、簡単にユーザーをログインさせます.詳細については、ここです。を参照してください.
serializerのフィールドはもちろん、受信ユーザ名とパスワードの2つです.
validate functionは入力したユーザー名とパスワードに合ったユーザーがいるか確認し、いなければValidationErrorが表示されるのでスキップします.
次に、新しい関数perform loginを作成します.
ここで新しい関数を作成する理由は、save methodやcreate methodなどのデフォルトの組み込み関数を上書きできますが、論理的にはlogin操作は保存されていないか、生成されていないため、関数を個別に作成できます.
実際のコードは簡単です.request.これは、データに合致するユーザーを入力してログインすれば簡単なコードです.
コードについて次のような疑問を抱く人もいます.validate functionとperform loginはauthenticate functionを使用しており、コードの形式はほとんど似ていますが、なぜvalidateに直接ログインしないのでしょうか.
これは間違いではない.しかし,開発にとって論理の分離は非常に重要である.validate functionの役割は、要求によって入力されたデータが有効であるかどうかを検証することです.したがって,その役割を的確に果たすことが重要である.このように論理の分離を常に考え,コードを記述することが重要である.△ただ、私もまだまだです.
views.py
viewコードは簡単です.まず、ModelView Setを使用して、ユーザーにView Setを作成します.続いてLoginと+Logoutのviewfrom django.shortcuts import render
from rest_framework import viewsets, views
from rest_framework.response import Response
from django.contrib.auth.models import User
from .serializers import *
from django.contrib.auth import logout
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
class LoginView(views.APIView):
def post(self, request, *args, **kwargs):
serializer = LoginSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.perform_login(request)
return Response(serializer.data)
class LogoutView(views.APIView):
def post(self, request, *args, **kwargs):
logout(request)
return Response()
シーケンス化器で記述されるコードは、基本モデルではなく少し増加します.まず,前述したように,Userモデルにシーケンス化器を記述する.
UserSerializer
from rest_framework import serializers
from django.contrib.auth.models import User
class UserSerializer(serializers.ModelSerializer):
confirm = serializers.CharField(max_length=100, write_only=True)
email = serializers.EmailField(required=True)
class Meta:
model = User
fields = ['id', 'username', 'password', 'email', 'confirm']
これは優先的に作成された内容です.通常のModelSerializerのように見え、ユーザーのCRUD操作に使用されます.ここで確認フィールドは確認パスワードとして扱われます.optionではwrite only=trueが付加されています.これは、データストレージではなく会員登録にのみ使用されるためです.write only=Trueは入力値ですが、DBには格納されません.反対のオプションはread only=trueです.
掲示板関連のSerializerについては,この程度でコードは終了しているが,Userについては,作成するコードが残っている.
次はvalidate関数を上書きする必要があります.
def validate(self, data):
if data['password'] != data['confirm']:
raise serializers.ValidationError('비밀번호와 비밀번호 확인이 일치하지 않습니다')
return data
前の記事ではほんの一部しか言及していませんが、serializerの機能の核心機能はinputを検証することです.入力したデータが論理に合っているかどうかを確認します.したがって、以上のコードは「confirm」フィールドを入力するとき!passwordと異なる場合はerrorが生成されます.そうでない場合は、デフォルトの設計に従ってデータが返されます.
ここで基本的なデザインを見たい場合は、ここです。を参照してください.
次にcreateとupdate functionを上書きする必要があります.この2つの関数は、すべてのserializerのデフォルトロジックです.基本的な実装の構成は次のとおりです.
1. serializer.save()メソッドが実行されます.
2.create()またはupdate()は、インスタンスが存在するかどうかを示します.
3.したがって、新しいオブジェクトが作成されるか、指定されたインスタンスが入力されたデータに更新されます.
def create(self, validated_data):
validated_data.pop('confirm')
user = User.objects.create(**validated_data)
user.set_password(validated_data['password'])
user.save()
return user
def update(self, instance, validated_data):
instance.username = validated_data['username']
instance.password = validated_data['password']
instance.email = validated_data['email']
instance.save()
return instance
これは非常に簡潔で分かりやすいコードです.createの場合、データを確認する必要はありませんので、削除後、残りのvalidate dataを使用して新しいUser objectを作成します.ここでvalidate dataは、前に書いたvalidate関数でデータを入力します!また、passwordを単独で追加する理由は、Djangoが提供するUser modelがpasswordを単独で追加する必要があるためである.(経験は私たちに...詳細な原因は正式なドキュメントで見つけることができることを教えてくれます.)とにかくパスワードを単独で注入したのでuser()を保存してユーザーに戻ります.
updateの場合は、データを再更新するだけです.
LoginSerializer
ModelSerializerではなく、最初のSerializerです.このシーケンス化器はloginに使用されます.またlogin用のシーケンス化器を作成するのは、要求するデータの形式が異なる、すなわち受信するデータのフォーマットが異なるためである.最終的に、任意のデータがバックエンドで使用される場合、シーケンス化器が必要であると容易に考えられる.そこでloginのシーケンス化器を作成します
from django.contrib.auth import authenticate, login
class loginSerializer(serializers.Serializer):
username = serializers.Charfield(max_length=100, required=True)
passwod = serializers.Charfield(max_length=100, required=True)
def validate(self, data):
user = authenticate(username=data['username'], password=data['password'])
if user is None:
raise serializers.ValidationError('아이디 혹은 비밀번호가 잘못되었습니다')
return data
def perform_login(self, request):
user = authenticate(username=request.data['username'], password=request.data['password'])
login(request, user)
return user
まずauthenticateとloginをインポートします.authenticateで、ユーザー名とパスワードを入力し、ユーザーが存在する場合はユーザーオブジェクトを返し、存在しない場合はNoneを返します.loginの場合、簡単にユーザーをログインさせます.詳細については、ここです。を参照してください.serializerのフィールドはもちろん、受信ユーザ名とパスワードの2つです.
validate functionは入力したユーザー名とパスワードに合ったユーザーがいるか確認し、いなければValidationErrorが表示されるのでスキップします.
次に、新しい関数perform loginを作成します.
ここで新しい関数を作成する理由は、save methodやcreate methodなどのデフォルトの組み込み関数を上書きできますが、論理的にはlogin操作は保存されていないか、生成されていないため、関数を個別に作成できます.
実際のコードは簡単です.request.これは、データに合致するユーザーを入力してログインすれば簡単なコードです.
コードについて次のような疑問を抱く人もいます.validate functionとperform loginはauthenticate functionを使用しており、コードの形式はほとんど似ていますが、なぜvalidateに直接ログインしないのでしょうか.
これは間違いではない.しかし,開発にとって論理の分離は非常に重要である.validate functionの役割は、要求によって入力されたデータが有効であるかどうかを検証することです.したがって,その役割を的確に果たすことが重要である.このように論理の分離を常に考え,コードを記述することが重要である.△ただ、私もまだまだです.
views.py
viewコードは簡単です.まず、ModelView Setを使用して、ユーザーにView Setを作成します.続いてLoginと+Logoutのviewfrom django.shortcuts import render
from rest_framework import viewsets, views
from rest_framework.response import Response
from django.contrib.auth.models import User
from .serializers import *
from django.contrib.auth import logout
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
class LoginView(views.APIView):
def post(self, request, *args, **kwargs):
serializer = LoginSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.perform_login(request)
return Response(serializer.data)
class LogoutView(views.APIView):
def post(self, request, *args, **kwargs):
logout(request)
return Response()
from django.shortcuts import render
from rest_framework import viewsets, views
from rest_framework.response import Response
from django.contrib.auth.models import User
from .serializers import *
from django.contrib.auth import logout
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
class LoginView(views.APIView):
def post(self, request, *args, **kwargs):
serializer = LoginSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.perform_login(request)
return Response(serializer.data)
class LogoutView(views.APIView):
def post(self, request, *args, **kwargs):
logout(request)
return Response()
UserViewSet
UserViewSetは一般的なModelViewSetなのでスキップ
LoginView
前の記事でも言ったように、viewはコントローラの役割であり、論理的に実現される場所です.したがって、Login機能はLoginViewによって実行される.postを上書きする理由は、LoginがPOSTメソッドを使用してリクエストを受信するためである.
これは、ログアウトを簡単に実行するビューです.postは上書きされますが、内部ではログアウトさせるだけです.
urls.py
まずaccountのurlsをroot urlsに関連付けます// blog_back/urls.py
urlpatterns = [
...,
path('', include('account.urls'),
]
そしてsun account/urlsです.pyの作成from django.urls import path, include
from rest_framework import routers
from .views import *
router = routers.DefaultRouter()
router.register(r'user', UserViewSet)
urlpatterns = [
path('', include(router.urls)),
path('login/', LoginView.as_view(), name='login'),
path('logout/', LogoutView.as_view(), name='logout')
]
ルーターでUserViewSetに接続します.
LoginViewとLogoutViewは、それぞれ「login/」と「logoout/」に接続されています.
settings.変更
残りは最後も一番大切な部分です.djangoには、authenticationを使用するための構成部分もあります.方式は主にtokenとsessionId方式があり、sessionId方式を使用します!
このために、設定します.pyにコンテンツを追加する必要があります.// in settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
),
}
確認して完了
不眠症で設定が正しいか確認します
ユーザー/に適合するデータフォーマットでPOSTを送信すると、ユーザーcreate、すなわち会員登録が正常に行われていることがわかります!
ログインしようとすると、次のエラーが発生する可能性があります.
のようなCSRFについて説明する記事を書く予定です.このエラーが発生するのを心配しないでください.作成したurlで機能が正常に動作していることを確認できます.
Reference
この問題について(DRF+Reactを使用した類似開発(blog)(5)ユーザモデルシーケンサ、ビュー作成+Urls接続の作成), 我々は、より多くの情報をここで見つけました
https://velog.io/@heyday_7/DRFReact로-Blog유사-velog-만들어보기-5-유저-모델-Serializer-View-만들기-Urls-연결
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
// blog_back/urls.py
urlpatterns = [
...,
path('', include('account.urls'),
]
from django.urls import path, include
from rest_framework import routers
from .views import *
router = routers.DefaultRouter()
router.register(r'user', UserViewSet)
urlpatterns = [
path('', include(router.urls)),
path('login/', LoginView.as_view(), name='login'),
path('logout/', LogoutView.as_view(), name='logout')
]
残りは最後も一番大切な部分です.djangoには、authenticationを使用するための構成部分もあります.方式は主にtokenとsessionId方式があり、sessionId方式を使用します!
このために、設定します.pyにコンテンツを追加する必要があります.
// in settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
),
}
確認して完了
不眠症で設定が正しいか確認します
ユーザー/に適合するデータフォーマットでPOSTを送信すると、ユーザーcreate、すなわち会員登録が正常に行われていることがわかります!
ログインしようとすると、次のエラーが発生する可能性があります.
のようなCSRFについて説明する記事を書く予定です.このエラーが発生するのを心配しないでください.作成したurlで機能が正常に動作していることを確認できます.
Reference
この問題について(DRF+Reactを使用した類似開発(blog)(5)ユーザモデルシーケンサ、ビュー作成+Urls接続の作成), 我々は、より多くの情報をここで見つけました
https://velog.io/@heyday_7/DRFReact로-Blog유사-velog-만들어보기-5-유저-모델-Serializer-View-만들기-Urls-연결
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
Reference
この問題について(DRF+Reactを使用した類似開発(blog)(5)ユーザモデルシーケンサ、ビュー作成+Urls接続の作成), 我々は、より多くの情報をここで見つけました https://velog.io/@heyday_7/DRFReact로-Blog유사-velog-만들어보기-5-유저-모델-Serializer-View-만들기-Urls-연결テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol