接下來要實作的部分是更新 user 的 API 端點。
進入 user/serializers.py,在UserSerializer
加入:
class UserSerializer(serializers.ModelSerializer):
# ...
def update(self, instance, validated_data):
"""Update and return user."""
password = validated_data.pop('password', None)
user = super().update(instance, validated_data)
if password:
user.set_password(password)
user.save()
return user
這邊使用.pop()
拿取請求中的密碼,若無密碼則回傳None
,下方再加上條件判斷,若有新密碼則更新。user 部分使用原本ModelSerializer
的.update()
函式進行更新,最後回傳 user。儲存後進入 user/views.py,加入:
# 新導入
from rest_framework import generics, authentication, permissions
# ...
class ManageUserView(generics.RetrieveUpdateAPIView):
"""Manage the authenticated user."""
serializer_class = UserSerializer
authentication_classes = [authentication.TokenAuthentication]
permission_classes = [permissions.IsAuthenticated]
def get_object(self):
"""Retrieve and return the authenticated user."""
return self.request.user
這邊新增的 class 繼承自RetrieveUpdateAPIView
,因此可以進行更新實例的功能,因為此端點需要限制存取,所以除了 serializer 之外還指定了兩個權限相關的 class:TokenAuthentication
為驗證方法,IsAuthenticated
檢查使用者是否通過驗證。最後的函式覆寫RetrieveUpdateAPIView
的 get method,改成回傳發出請求且通過授權的使用者,用此使用者進行資料更新。
最後,進入 user/urls.py 加入 path:
# ...
urlpatterns = [
# ...
path('me/', views.ManageUserView.as_view(), name='me')
]
都儲存後,便可以執行伺服器測試看看,因為這個端點需要授權,所以大概說明一下如何進行授權。先進入 API 頁面,此時應該會長這樣:
可以先測試看看需要授權的端點接收請求時是否會回應 401。先創建一個 user 或是用已存在的 user 獲得一個 token 並複製,接著點擊右上角的 Authorize 後,下滑到最後一個 tokenAuth 選項,在 Value 欄位中填入 Token 加一個空白,接著貼上剛剛複製的 token,最後按下 Authorize 按鈕。再測試看看那些端點有沒有變成功的回應(2XX)。
到這邊 User 的部分就差不多結束了,接下來會開始製作 books API,中間會穿插一些觀念的教學。我們明天見~