3/3-6
axiosのpostメソッド
const newTask=(task)=>{
const data={
title:task.title
}
headers:{
}
}).then(res=>{setTasks([...tasks,res.data])})
}
- .post()
<input type="text" name="title" value={editedTask.title} onChange={HandleInputChange()} placeholder="New task" required />
<button onClick={()=>{newTask(editedTask)}}>Create</button>
- placeholder属性
- テキストボックス内に表示される「例」
- required
- 入力必須
const HandleInputChange=()=>evt=>{
const name=evt.target.name;
}
- [name]のようにObjectにする意味(title)は?
3/3-5
axiosのメソッド
- .get()
- 第1引数にURL
- 第2引数にheaders:{"Authorization":"Token トークン"}を取る
- 続いて.then(res=>useState関数(res.data)とすることで
- 得られたデータをuseState変数に格納する
- .delete()
- 第1引数にURL
- 第2引数にheaders:{"Authorization":"Token トークン"}を取る
- これだけで該当のデータを削除する
シングルページ化
- 更新することなく変更を反映する
- axios.delete()を使ったときにシングルページ化する
-
.then(res=>{setTasks(tasks.filter(task=>task.id !==id));setSelectedTask()})
- axios.delete()に続けて更新する処理を書く
- fileterメソッド
- 引数がfaleseの時要素は取り除かれる
- setSelectedTask()で選んで表示させてる方も空にする
- fileterメソッド
- axios.delete()に続けて更新する処理を書く
-
Font-Awesome
- アイコンのリスト?Css?
- npmでインストールする
- cdnjsでインストールする
- google「cdnjs」
- font-awesome
- public/index.html内にリンクを貼る
-
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css" />
-
3/3-4
- CORSのインストール
- プロジェクト/settings.pynosettei
- CORSを設定する
- INSTALLED_APPS=
- 'corsheaders',を加える
- MIDDLEWARE=
- 'corsheaders.midddleware.CorsMiddleware'を加える
- CORS_ORIGIN_WHITELIST=の新規作成
- 'htttp://localhost:3000'を加える
React側
- src/components/DrfAPIFetch.jsを作る
-
import React,{useState,useEffect} from 'react'import axios from 'axios'
const DrfAPIFetch = () => {
const [tasks,setTasks]=useState()
useEffect(()=>{headers:{}}).then(res =>{setTasks(res.data)})},[])
return (<div><ull>{tasks.map(task=><li key={task.id}>{task.title} {task.id}</li>)}</ull></div>)}
export default DrfAPIFetch - あ
-
- src/App.js
- DrfAPIFetchを読み込んでタグを作る
3/3-3
urls
- プロジェクト/urls.py
- アプリ/urls.py
- 初期からはないので自分で作る
-
from rest_framework import routersfrom apiapp.views import TaskViewSet,UserViewSet,ManageUserView
router = routers.DefaultRouter()router.register('tasks',TaskViewSet)router.register('users',UserViewSet)
urlpatterns = [path('myself/',ManageUserView.as_view(),name='myself'),path('',include(router.urls)),]
-
- プロジェクトのurls.pyで「URL/api」へのアクセスがあったときに繋がる
- routers.DefaultRouter
- SimpleRouterをAPIのために拡張したクラス
- routers.DefaultRouter.register('tasks',TaskViewSet)
- /api/tasks/へのアクセスを確立している
- TaskViewSetに従う
- routers.DefaultRouter.register('users',UserViewSet)
- /api/users/へのアクセスを確立している
- UserViewSetに従う
- path('myself/',ManageUserView.as_view(),name='myself')
- /api/myself/へのアクセスを確立している
- 自分のログイン情報?
- /api/myself/へのアクセスを確立している
3/3-2
アプリ/views.py
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated,AllowAny
from rest_framework import viewsets
from .models import Task
from .serializers import TaskSerializer,UserSerializer
class UserViewSet(viewsets.ModelViewSet):
queryset=User.objects.all()
serializer_class=UserSerializer
permission_class=(AllowAny,)
serializer_class=UserSerializer
authentication_classes=(TokenAuthentication,)
permission_classes=(IsAuthenticated,)
def get_object(self):
return self.request.user
class TaskViewSet(viewsets.ModelViewSet):
queryset=Task.objects.all()
serializer_class=TaskSerializer
authentication_classes=(TokenAuthentication,)
permission_classes=(IsAuthenticated,)
- TokenAuthentication
- IsAuthenticated
- rest_framework.permissionsに含まれている
- パーミッションクラス、ユーザーを制限するための組み込みクラス
- 要ログイン
- AllowAny
- rest_framework.permissionsに含まれている
- パーミッションクラス、ユーザーを制限するための組み込みクラス
- 全許可
- viewsets.ModelViewSetクラス
- rest_frameworkに含まれる組み込みクラス
- UserViewSet,TaskViewSetクラスはこのクラスを継承して作られている
- 基本項目として以下のものが挙げられる
- generics.RetrieveUpdateAPIView
- HTTPリクエストに関するクラス
3/3
- シリアライザー
- シリアライズするためのライブラリ
- 入力でもらった情報を隠しながらDBに伝える
- 出力においても隠す
- アプリ/serializers.py
- 新規作成する
-
from rest_framework import serializersfrom .models import Taskfrom rest_framework.authtoken.models import Token
class UserSerializer(serializers.ModelSerializer):class Meta:model =Userfields=['id','username','password']extra_kwargs={'password':{'write_only':True,'required':True}}
def create(self,validated_data):user=User.objects.create_user(**validated_data)Token.objects.create(user=user)return user
class TaskSerializer(serializers.ModelSerializer):
created_at=serializers.DateTimeField(format="%Y-%m-%d %H:%M",read_only=True)updated_at=serializers.DateTimeField(format="%Y-%m-%d %H:%M",read_only=True)
class Meta:model =Taskfields=['id','title','created_at','updated_at'] - serializersはrest_frameworkに含まれている
- Userモデル
- django.contrib.auth.modelsに含まれているモデル
- セキュリティの高い認証システム
- django.contrib.auth.modelsに含まれているモデル
- Token
- rest_framework.authtoken.modelsに含まれている
- ユーザのuserIDとpasswordを認証してtokernを返す
- rest_framework.authtoken.modelsに含まれている
- メタクラス
- class文の持つ定義する機能」を定義する機能
- fields
- メタクラスでfields=[]として定義することでモデルを使うカラムを定義
-
python - Django: what do model and fields do in meta class? - Stack Overflow
- extra_kwards
- より詳細に制限をする
- 辞書型
- キーに個別のフィールドを
- 制限を要素におき制限自体も辞書型とする。
- write_only:True
- 書き込み専用
- required:True
- 要求されても返さない
- write_only:True
- より詳細に制限をする
- バリデーション
- 意図しない値が入力された時エラーを発生させる
- validated_data
- そもそもテンプレート化してるっぽい