在Django中進行用戶注冊和郵箱驗證的方法
本文主要介紹我在利用Django寫文章時,采用的注冊方法。首先說一下整體邏輯思路:
•處理用戶注冊數(shù)據(jù),
•產(chǎn)生token,生成驗證URL,
•發(fā)送驗證郵件,
•用戶登錄網(wǎng)址,進行驗證,
•驗證處理。
具體步驟:
1、添加用戶
在Django中自帶的User表中,有一個is_active字段,默認值是True,即用戶填完表單提交之后,就可以進行登錄。我們這里首先將is_acitve字段設為False,也就是說,必須經(jīng)過后續(xù)的郵箱驗證,才能夠正常登錄。
部分代碼:
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()
提交后,數(shù)據(jù)庫中會增加一條記錄,但is_acitve字段為False,此時還不是有效用戶。
2、郵件驗證
郵件驗證主要有兩步,一是產(chǎn)證token,即加密,二是處理驗證鏈接。
1)產(chǎn)生token
之前我采用的是簡單的base64加解密方法, 但終究是太簡單了,后來看到關于Flask的驗證用戶的文章(http://python.jobbole.com/81410/),就采用了itsdangerous序列化方法,其實Flask的session就用了itsdangerous序列化。我使用它的重要原因是它自帶有一個時間戳,而且序列化方法要比單純的使用base64給力得多。
代碼:
from itsdangerous import URLSafeTimedSerializer as utsr import base64 import re
class Token():
def __init__(self,security_key): self.security_key = security_key self.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是經(jīng)過base64加密的SECRET_KEY, generate_validate_token函數(shù)通過URLSafeTimedSerializer在用戶注冊時生成一個令牌。用戶名在令牌中被編了碼。生成令牌之后,會將帶有token的驗證鏈接發(fā)送到注冊郵箱。在confirm_validate_token函數(shù)中,只要令牌沒過期,那它就會返回一個用戶名,過期時間為3600秒。
發(fā)送郵件函數(shù)代碼:
token = token_confirm.generate_validate_token(username)
#active_key = base64.encodestring(username)
#send email to the register email
message = "\n".join([
u'{0},歡迎加入我的博客'.format(username),
u'請訪問該鏈接,完成用戶驗證:',
'/'.join([DOMAIN,'account/activate',token])
])
send_mail(u'注冊用戶驗證信息',message, None,[email])
2)處理郵件驗證
就是對應驗證鏈接的視圖函數(shù),該函數(shù)的主要目的是將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 = True user.save()
這里要說一下url的設置。經(jīng)過itsdangerous產(chǎn)生的token是隨機且規(guī)律的,說它規(guī)律是因為它是由三部分組成,并由點號隔開。類似這樣:Imhibm4i.Cg-UAQ.n7ZI2N9kUZ1eOcfBtxlMOdOYYE0。說它隨機是因為每一部分的內容可能不僅僅含有字母數(shù)字,可能還含有連接符-,_。因此url應該是:url(r'^account/activate/(?P<token>\w+.[-_\w]*\w+.[-_\w]*\w+)/$','blog.views.active_user',name='active_user')
經(jīng)過上述操作后,用戶就可以利用剛注冊的用戶名進行登錄了。
貼出完整代碼:
from utils.token import Token from django.core.mail import send_mail from .forms import UserLoginForm,CustomUserCreationForm token_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 email
message = "\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 link
that 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'對不起,驗證鏈接已經(jīng)過期')
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
return HttpResponse(u'對不起,您所驗證的用戶不存在,請重新注冊')
user.is_active = True
user.save()
confirm = u'驗證成功,請進行登錄操作。'
return HttpResponseRedirect('/account/login',{'confirm':confirm})
以上所述是小編給大家介紹的在Django中進行用戶注冊和郵箱驗證的方法,希望對大家有所幫助!
相關文章
python通過pillow識別動態(tài)驗證碼的示例代碼
在上網(wǎng)時,經(jīng)常會遇到驗證碼,本次試驗將帶領大家認識驗證碼的一些特性,并利用 Python 中的 pillow 庫完成對驗證碼的破解。感興趣的可以了解一下2021-11-11
Python?SQLAlchemy與數(shù)據(jù)庫交互操作完整指南
SQLAlchemy 是一個強大的 Python 庫,用于數(shù)據(jù)庫操作,無論是簡單的數(shù)據(jù)存儲還是復雜的數(shù)據(jù)管理,SQLAlchemy 都提供了多種方法來處理數(shù)據(jù)庫,本文將全面介紹 SQLAlchemy的基本用法以及各種操作的示例代碼2024-01-01
tensorflow 用矩陣運算替換for循環(huán) 用tf.tile而不寫for的方法
今天小編就為大家分享一篇tensorflow 用矩陣運算替換for循環(huán) 用tf.tile而不寫for的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07
Python fire模塊(最簡化命令行生成工具)的使用教程詳解
Python Fire是谷歌開源的一個第三方庫,用于從任何Python對象自動生成命令行接口(CLI),可用于如快速拓展成命令行等形式。本文將通過實例為大家詳細說說fire模塊的使用,感興趣的可以了解一下2022-10-10
python查詢MySQL將數(shù)據(jù)寫入Excel
這篇文章主要介紹了python如何查詢MySQL將數(shù)據(jù)寫入Excel,幫助大家利用python高效的辦公,感興趣的朋友可以了解下2020-10-10
Python + selenium + requests實現(xiàn)12306全自動搶票及驗證碼破解加自動點擊功能
這篇文章主要介紹了Python + selenium + requests實現(xiàn)12306全自動搶票及驗證碼破解加自動點擊功能,需要的朋友可以參考下2018-11-11

