国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

在Django中進行用戶注冊和郵箱驗證的方法

2020-01-04 17:28:44
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了在Django中進行用戶注冊和郵箱驗證的方法的相關資料,需要的朋友可以參考下
 

本文主要介紹我在利用Django寫文章時,采用的注冊方法。首先說一下整體邏輯思路:

•處理用戶注冊數據,

•產生token,生成驗證URL,

•發送驗證郵件,

•用戶登錄網址,進行驗證,

•驗證處理。

具體步驟:

1、添加用戶

在Django中自帶的User表中,有一個is_active字段,默認值是True,即用戶填完表單提交之后,就可以進行登錄。我們這里首先將is_acitve字段設為False,也就是說,必須經過后續的郵箱驗證,才能夠正常登錄。

部分代碼:

if request.method == 'POST':form = CustomUserCreationForm(request.POST)if form.is_valid():cd = form.cleaned_data#new_user = form.save()username,password,email = cd['username'],cd['password1'],cd['email']user = User.objects.create(username=username, password=password, email=email, is_active=False)user.set_password(password)user.save() 

提交后,數據庫中會增加一條記錄,但is_acitve字段為False,此時還不是有效用戶。

2、郵件驗證

郵件驗證主要有兩步,一是產證token,即加密,二是處理驗證鏈接。

1)產生token

之前我采用的是簡單的base64加解密方法, 但終究是太簡單了,后來看到關于Flask的驗證用戶的文章(http://python.jobbole.com/81410/),就采用了itsdangerous序列化方法,其實Flask的session就用了itsdangerous序列化。我使用它的重要原因是它自帶有一個時間戳,而且序列化方法要比單純的使用base64給力得多。

代碼:

from itsdangerous import URLSafeTimedSerializer as utsrimport base64import re

class Token():

def __init__(self,security_key):self.security_key = security_keyself.salt = base64.encodestring(security_key)def generate_validate_token(self,username):serializer = utsr(self.security_key)return serializer.dumps(username,self.salt)def confirm_validate_token(self,token,expiration=3600):serializer = utsr(self.security_key)return serializer.loads(token,salt=self.salt,max_age=expiration) 

security_key就是settings.py中設置的SECRET_KEY,salt是經過base64加密的SECRET_KEY, generate_validate_token函數通過URLSafeTimedSerializer在用戶注冊時生成一個令牌。用戶名在令牌中被編了碼。生成令牌之后,會將帶有token的驗證鏈接發送到注冊郵箱。在confirm_validate_token函數中,只要令牌沒過期,那它就會返回一個用戶名,過期時間為3600秒。

發送郵件函數代碼:

token = token_confirm.generate_validate_token(username)#active_key = base64.encodestring(username)#send email to the register emailmessage = "/n".join([u'{0},歡迎加入我的博客'.format(username),u'請訪問該鏈接,完成用戶驗證:','/'.join([DOMAIN,'account/activate',token])])send_mail(u'注冊用戶驗證信息',message, None,[email]) 

2)處理郵件驗證

就是對應驗證鏈接的視圖函數,該函數的主要目的是將User表中用戶的is_active字段更新為True。

def active_user(request,token):username = token_confirm.confirm_validate_token(token)user = User.objects.get(username=username)user.is_active = Trueuser.save() 

這里要說一下url的設置。經過itsdangerous產生的token是隨機且規律的,說它規律是因為它是由三部分組成,并由點號隔開。類似這樣:Imhibm4i.Cg-UAQ.n7ZI2N9kUZ1eOcfBtxlMOdOYYE0。說它隨機是因為每一部分的內容可能不僅僅含有字母數字,可能還含有連接符-,_。因此url應該是:url(r'^account/activate/(?P<token>/w+.[-_/w]*/w+.[-_/w]*/w+)/$','blog.views.active_user',name='active_user')

經過上述操作后,用戶就可以利用剛注冊的用戶名進行登錄了。

貼出完整代碼:

from utils.token import Tokenfrom django.core.mail import send_mailfrom .forms import UserLoginForm,CustomUserCreationFormtoken_confirm = Token(SECRET_KEY)

def Register(request):

if request.method == 'POST':form = CustomUserCreationForm(request.POST)if form.is_valid():cd = form.cleaned_data#new_user = form.save()username,password,email = cd['username'],cd['password1'],cd['email']user = User.objects.create(username=username, password=password, email=email, is_active=False)user.set_password(password)user.save()token = token_confirm.generate_validate_token(username)#active_key = base64.encodestring(username)#send email to the register emailmessage = "/n".join([u'{0},歡迎加入我的博客'.format(username),u'請訪問該鏈接,完成用戶驗證:','/'.join([DOMAIN,'account/activate',token])])send_mail(u'注冊用戶驗證信息',message, None,[cd['email']])#user = auth.authenticate(username=username,password=password)#auth.login(request,user)return HttpResponse(u"請登錄到注冊郵箱中驗證用戶,有效期為1個小時。")else:form = CustomUserCreationForm()return render(request,'register.html',{'form':form})def active_user(request,token):"""the view function is used to accomplish the user register confirm,only after input the linkthat sent to the register email,user can login the site normally.:param request::param activate_key:the paragram is gotten by encrypting username when user register:return:"""try:username = token_confirm.confirm_validate_token(token)except:return HttpResponse(u'對不起,驗證鏈接已經過期')try:user = User.objects.get(username=username)except User.DoesNotExist:return HttpResponse(u'對不起,您所驗證的用戶不存在,請重新注冊')user.is_active = Trueuser.save()confirm = u'驗證成功,請進行登錄操作。'return HttpResponseRedirect('/account/login',{'confirm':confirm})

以上所述是小編給大家介紹的在Django中進行用戶注冊和郵箱驗證的方法,希望對大家有所幫助!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 左权县| 五莲县| 余干县| 南郑县| 五河县| 瑞安市| 黔南| 永仁县| 马山县| 南皮县| 阳谷县| 盈江县| 湘潭市| 宾川县| 石狮市| 双峰县| 桃源县| 禹州市| 齐齐哈尔市| 台前县| 宽城| 象州县| 承德市| 新宁县| 开封县| 庄浪县| 苏尼特左旗| 肥东县| 育儿| 乌兰浩特市| 惠州市| 江山市| 金山区| 兴海县| 北辰区| 太康县| 镇巴县| 莎车县| 丰城市| 曲松县| 台北县|