今天我們要分享的是,撰寫一支簡易註冊功能的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)
這裡簡單說明一下我的想法,我的想法是利用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 ˋ