基於Django的使用者註冊及啟用實現
阿新 • • 發佈:2021-06-10
最近做專案的時候考慮過關於在django下使用者模型的設計,包括註冊和啟用的邏輯,雖然最後沒有采用這一臺,而是選擇了整合公司的AD,但還是寫一篇筆記記錄一下,以便以後回憶。
同步發表於個人站點:http://panzhixiang.cn
使用者模型如下
fromdjango.contrib.auth.modelsimportAbstractUser fromdjango.dbimportmodels classBaseModel(models.Model): """ 模型抽象基類 """ create_time=models.DateTimeField(auto_now_add=True,verbose_name='建立時間') update_time=models.DateTimeField(auto_now=True,verbose_name='更新時間') is_delete=models.BooleanField(default=False,verbose_name='刪除標記') classMeta: #說明這是一個抽象模型類 abstract=True classUser(AbstractUser,BaseModel): """ 使用者模型類 """ classMeta: db_table='user' verbose_name='使用者' verbose_name_plural=verbose_name def__str__(self): returnself.username
使用者啟用流程如下:
fromdjango.views.genericimportView fromitsdangerousimportTimedJSONWebSignatureSerializerasTJWSS fromitsdangerousimportSignatureExpired classRegisterView(View): """ 註冊類檢視,get請求方法顯示註冊頁面,post方法處理註冊請求. 使用者提交註冊請求,後端接受請求以及資料後首先驗證資料是否完整並符合要求; 在驗證使用者名稱是否已經存在,在我們設計的時候使用者資料比較簡單,只有使用者名稱和郵箱,並且只能使用使用者名稱登入,所以模型比較簡單,實際在TOC或者TOB的時候一般都要相容使用者名稱、郵箱和手機號都能登入; 新使用者建立後需要設定使用者狀態為“未啟用”,在django的AbstractUser中也就是要給is_active屬性賦值為False; 最後要給使用者傳送一封包含使用者身份資訊的啟用郵件,這裡使用使用者ID作為唯一標誌; """ defget(self,request): returnrender(request,'register.html') defpost(self,request): username=request.POST.get('user_name') pwd=request.POST.get('pwd') cpwd=request.POST.get('pwd') email=request.POST.get('email') allow=request.POST.get('allow') ifnotall([username,pwd,email]): returnrender(request,'register.html',{'errmsg':'資訊填寫不完整!'}) ifallow!='on': returnrender(request,'register.html',{'errmsg':'請勾選統一協議!'}) ifnotre.match(r'^[a-z0-9][\w.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$',email): returnrender(request,'register.html',{'errmsg':'郵箱格式不正確!'}) #驗證使用者名稱是否已經存在 try: user=User.objects.get(username=username) exceptUser.DoesNotExistaserr: user=None else: returnrender(request,'register.html',{'errmsg':'該使用者名稱已經存在!'}) try: user=User.objects.create_user(username,email,pwd) exceptExceptionaserr: #這裡應該有一個錯誤捕捉和提醒機制 print(err) returnrender(request,'register.html',{'errmsg':'註冊失敗,請再次註冊'}) else: #新建使用者預設不啟用,需要使用者點選啟用連線之後再設為啟用狀態 user.is_active=False user.save() #初始化加密器,配置祕鑰和超時時間 encrypter=TJWSS(SECRET_KEY,3600) encrypted_user_id=encrypter.dumps(user.id).decode('utf-8') send_active_email.delay([email,],encrypted_user_id) returnrender(request,'index.html') classActiveView(View): """ 使用者啟用類檢視 """ defget(self,request,encrypted_user_id): encrypter=TJWSS(SECRET_KEY,3600) try: user_id=encrypter.loads(encrypted_user_id) user=User.objects.get(id=user_id) user.is_active=1 user.save() returnredirect(reverse('user:login')) exceptSignatureExpiredaserr: returnHttpResponse('啟用連結已經過期')