iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0
自我挑戰組

轉職新手學 Django 及 DRF系列 第 24

Day 24 - 製作 API(四) User 更新端點

  • 分享至 

  • xImage
  •  

接下來要實作的部分是更新 user 的 API 端點。

Update 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,中間會穿插一些觀念的教學。我們明天見~


上一篇
Day 23 - 中場暫停(二) HTTP 狀態碼
下一篇
Day 25 - 中場暫停(三) APIView vs ViewSets
系列文
轉職新手學 Django 及 DRF30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言