第一步: 前期分析
可見, 前端會post過來三個字段, 所以這裡我們應該使用mixins.createmodelmixin
由於我們自定義的userprofile中只有name是必填字段(注意:django自帶的user中username是必填字段), 所以我們可以在serializers.py中使用serializers.modelserializer
code的驗證需要單獨的validate_code()方法
但是有乙個問題, 傳過來的code是我們userprofile中沒有的字段, 怎麼使用modelserializer時將code驗證並過濾掉? 答:先增加乙個code欄位, 然後使用全域性鉤子刪掉code這個字段
注意: 上面這個頁面, vue前端post過來的手機號碼放在username屬性裡的, 所以我們在取手機號碼的時候, 應該用來self.initial_data["username"]取, 然後我們自己將其複製到mobile屬性中去
這裡我們還需要學會自定義錯誤提示資訊error_messages,
雖然在傳送驗證碼階段, 已經驗證了手機號碼是否存在,但在這裡由於前端post的是使用者名稱,所以也要對使用者名稱進行去重驗證uniquevalidator,校驗是否已經存在
第二步: 寫**
1.首先寫userserializer, 專門來處理code的驗證, 和username去重的驗證
from rest_framework importserializers
from django.contrib.auth import
get_user_model
from rest_framework.validators import uniquevalidator #
給username欄位做查重用
user = get_user_model() #
可以獲取資料庫的userprofile表
#驗證碼校驗
class
userregserializer(serializers.modelserializer):
#由於userprofile並沒有code欄位,所以先加進來
code = serializers.charfield(required=true, max_length=4, min_length=4,
#自定義的錯誤提示資訊
error_messages=,
help_text="
驗證碼"
)
#雖然在傳送驗證碼階段, 已經驗證了手機號碼是否存在,但在這裡由於前端post的是使用者名稱,所以也要對使用者名稱進行驗證,校驗是否已經存在
username = serializers.charfield(required=true,allow_blank=false,
validators=[uniquevalidator(queryset=user.objects.all(),message="
使用者已經存在
")])
#區域性鉤子, 只對code進行校驗
defvalidate_code(self, code):
#post過來的資料封裝在self.initial_data裡, 且傳遞過來手機號的key是username
#一定要按時間排序,因為我們只會取最後一條code來驗證
verify_records = verifycode.objects.filter(mobile=self.initial_data["
username
"]).order_by("
add_time")
#如果驗證碼存在
ifverify_records:
#取最新的那一條驗證碼
last_records =verify_records[0]
#驗證碼有效期為5min
five_minute_ago = datetime.now() - timedelta(hours=0, minutes=5, seconds=0)
if five_minute_ago raise serializers.validationerror("
驗證碼過期")
#驗證碼核對
if last_records.code !=code:
raise serializers.validationerror("
驗證碼錯誤")
#如果驗證碼不存在, 則直接報錯
else
:
raise serializers.validationerror("
驗證碼錯誤")
#全域性鉤子, 目的是過濾掉code欄位(code其實只用於驗證,而不用存在userprofile表中)
#attrs是區域性鉤子清洗後的所有欄位的dict
defvalidate(self, attrs):
attrs[
"mobile
"] = attrs["
username"]
del attrs["
code"]
return
attrs
class
meta:
model =user
fields = ("
username
", "
code
", "
mobile
")
然後是views.userviewset
#使用者註冊邏輯
class
userviewset(createmodelmixin,viewsets.genericviewset):
serializer_class=userregserializer
別忘記配置url
#使用者註冊介面(包含code驗證,username去重驗證)
router.register(r'
users
', userviewset, basename="
users
")
2. 最後去瀏覽器驗證
--- 君子處其實,不處其華;治其內,不治其外張居正----
微信停止服務印度手機號註冊使用者
techweb 7月26日訊息,據 報道,大量印度使用者反應,使用微信時會被強制退出,而且無法再登陸。在賬號被登出時,使用者收到一條來自微信團隊的資訊,寫道 根據印度法律,我們目前不能為您提供微信服務。我們重視每一位使用者,資料安全和隱私對我們來說是最重要的。我們正在與相關部門接觸,希望能夠在未來恢...
Django部落格搭建 使用者註冊3 手機號校驗
本文接上文 請求方法 get url定義 mobiles p1 3 9 d 請求引數 url路徑引數 引數型別 是否必傳 描述mobiles數字是 使用者輸入 手機號校驗的方法與使用者名稱校驗類似,先說一下簡單思路 使用者在前台輸入手機號,然後焦點移出手機輸入框後 js的blur事件 js通過jqu...
生活之 手機號可能註冊的賬號
由於我們的手機號碼會繫結很多東西,所以當我們手機號碼更換後,應該要及時解綁或者換綁各種賬號繫結。下面就列舉各種需要留意的賬號繫結平台 社交類qq 微博人人 豆瓣支付類 支付寶財付通 天貓 京東當當網 蘇寧易購 郵箱qq郵箱 163郵箱 谷歌郵箱 銀行卡工商銀行 招商銀行 建設銀行 郵政儲蓄銀行 農村...