1. 程式人生 > 其它 >基於Django的使用者註冊及啟用實現

基於Django的使用者註冊及啟用實現

最近做專案的時候考慮過關於在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('啟用連結已經過期')