iT邦幫忙

2021 iThome 鐵人賽

DAY 10
0
Modern Web

暑假旅程之自學Django系列 第 10

[Day10] 註冊API – views

今天我們要分享的是,撰寫一支簡易註冊功能的API,先來到我們的views檔案,如同我們之前所說Views檔案就是傳遞訊息橋梁以及撰寫主要邏輯的地方,底下是我的程式碼

程式碼

from datetime import datetime
import json
import uuid
from django.contrib.auth.models import User
from django.http.response import JsonResponse
from django.views.decorators.csrf import csrf_protect
from user.models import UserProfile

@csrf_protect 
def register(request):
    if request.method == "POST": 
        try:
            data = json.loads(bytes.decode(request.body,"utf-8")) 
            account = data["account"]
            password = data["password"]
            email = data["email"]
            phone = data["phone"]
            id = uuid.uuid5(uuid.NAMESPACE_DNS,account)
            check_account = UserProfile.objects.filter(account=account).first()
            if check_account is None :
                user = UserProfile.objects.create_user(id=id,username=account,account=account,email=email,phone=phone)
                user.set_password(password)
                user.save()
                message = {"status" : "註冊成功"}
            else :
                message = {"status" : "註冊失敗,帳號已註冊"}
        except Exception as e:
            message = {"status" : "error"}
    return JsonResponse(message)

想法及介紹function

這裡簡單說明一下我的想法,我的想法是利用uuid5產生一個唯一值能夠作為pk,使用filter().first()查詢是否已經有使用相同帳號註冊的使用者,如果有返回並非None,以此判斷重複註冊,如果判斷沒有重複註冊則創建一個使用者資料。

接著說明一下function

  • @csrf_protect:來預防csrf攻擊,如果不用的話可以改用@csrf_exempt

  • if request.method == "POST"::判斷HTTP method是否為POST。

  • data = json.loads(bytes.decode(request.body,"utf-8")):把原始request的資料層層解碼轉換格式。

  • account = data["account"]:讀取account key裡的value。

  • id = uuid.uuid5(uuid.NAMESPACE_DNS,account):使用uuid5的方式對account做加密處理產生一組uuid。

  • check_account = UserProfile.objects.filter(account=account).first():從資料庫中抓取第一筆符合account=account的資料(例如資料庫已經有account=abc123),就會返回,若沒有就返回None,以這個為依據判斷是否重複註冊。

  • user=UserProfile.objects.create_user(id=id,username=account,account=account,email=email,phone=phone):使用UserProfile的資料格式,建立()中輸入的資料

這裡有官方文件,裡面有對於csrf_protect更詳細的介紹唷。

今天就先到這邊啦~~ 預告一下我們明天即將要進入urls。
阿對了,今天有提到csrf,如果有夥伴對這些有疑問,在urls過後,要測試API之前我會再跟各位夥伴補充說明,請夥伴們見諒ˊ V ˋ


上一篇
[Day9] 註冊API – admin
下一篇
[Day11] 註冊API – urls之專案資料夾
系列文
暑假旅程之自學Django30

尚未有邦友留言

立即登入留言