Django發(fā)送郵件和itsdangerous模塊的配合使用解析
項目需求:用戶注冊頁面注冊之后,系統(tǒng)會發(fā)送一封郵件到用戶郵箱,用戶點擊鏈接以激活賬戶,其中鏈接中的用戶信息需要加密處理一下
其中激活自己郵箱的smtp服務的操作就不在加以說明,菜鳥教程上有非常清晰的講解,也可以去網(wǎng)上搜索詳細步驟
首先在Django項目的settings文件中配置發(fā)送郵件相關(guān)的配置如下:
# 固定寫法 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' # smtp服務器地址 EMAIL_HOST = 'smtp.qq.com' # 固定端口號 EMAIL_PORT = 25 #發(fā)送郵件的郵箱 EMAIL_HOST_USER = '2746565701@qq.com' #在郵箱中設置的客戶端授權(quán)密碼 EMAIL_HOST_PASSWORD = 'ytnvwapcbxmcdfig' #收件人看到的發(fā)件人,尖括號中的必須與上面的user一致 EMAIL_FROM = '天天生鮮<2746565701@qq.com>'
用戶模塊的views.py文件關(guān)于itsdangerous和郵件發(fā)送的代碼如下,項目其它部分的操作代碼這里全部刪除,這里使用的是基于類的視圖:
基本邏輯:
- 利用itsdangerous模塊對鏈接中的用戶信息加密,生成加密后的用戶信息token;
- 調(diào)用Django發(fā)送郵件的相關(guān)方法,進行發(fā)送郵件(郵件的配置已經(jīng)配置好);
- 郵件發(fā)送的鏈接中有一個可變參數(shù),包含著用戶id加密后的信息;
- 用戶接收到郵件之后,點擊鏈接,跳轉(zhuǎn)到對應的視圖類進行處理;
- 負責激活的視圖類,解密用戶的信息,獲取用戶id,查詢到對應用戶(在這個過程會判斷被加密的信息是否超時);
- 將對應用戶中數(shù)據(jù)庫中用戶表中 is_active 字段的值改為1,表示此用戶被激活;
- 跳轉(zhuǎn)到首頁;
# 導入itsdangerous中要用到的加密類
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
# 導入itsdangerous中超時的異常
from itsdangerous import SignatureExpired
# 導入配置文件
from django.conf import settings
# 導入Django中的發(fā)送郵件的方法
from django.core.mail import send_mail
from .models import User
# Create your views here.
class RegisterView(View):
"""注冊"""
....................
def post(self, request):
"""進行注冊處理"""
# 發(fā)送激活郵件,包含一個激活的鏈接:https://127.0.0.1:8000/user/active/3
# 激活鏈接中需要包含用戶的身份信息,并且要把身份信息進行加密
# 加密用戶的身份信息,生成激活的token
serializer = Serializer(settings.SECRET_KEY, 3600) # 創(chuàng)建愛一個itsdangerous模塊中加密類的對象,其中SECRET_KEY用settings中的,第二個參數(shù)為超時時間
info = {'confirm': user.id} # 被加密的信息,一個字典,字典值為接收郵件用戶的id
# 利用dumps方法進行加密,加密后為bytes數(shù)據(jù)
token = serializer.dumps(info) # bytes數(shù)據(jù)
token = token.decode() # bytes轉(zhuǎn)str
# 發(fā)郵件
subject = '天天生鮮歡迎信息' # 郵件主題
message = '' 郵件信息,因為有html__message了,所以這里為空就好
sender = settings.EMAIL_FROM # 發(fā)送者,直接從配置文件中導入上面配置的發(fā)送者
receiver = [email] # 接收者的郵箱,是一個列表,這里是前端用戶注冊時傳過來的 email
# html結(jié)構(gòu)的信息,其中包含了加密后的用戶信息token
html_message = '<h1>{},歡迎您成為天天生鮮注冊會員</h1>請點擊下面鏈接激活您的用戶<br><a href="http:127.0.0.1:8000/user/active/{}" rel="external nofollow" >http:127.0.0.1:8000/user/active/{}</a>'.format(username, token, token)
# 調(diào)用Django發(fā)送郵件的方法,這里傳了5個參數(shù)
send_mail(subject, message, sender, receiver, html_message=html_message)
# 返回應答:跳轉(zhuǎn)到首頁
return redirect(reverse('goods:index'))
class ActiveView(View):
"""用戶激活"""
def get(self, request, token):
"""進行用戶激活"""
# 進行解密,獲取要激活的用戶信息
serializer = Serializer(settings.SECRET_KEY, 3600)
try:
# 通過itsdangerous模塊的loads方法解密
info = serializer.loads(token)
# 獲取待激活用戶的id
user_id = info.get('confirm')
# 根據(jù)id獲取用戶信息
user = User.objects.get(id=user_id)
# 激活用戶操作,將數(shù)據(jù)庫中對應用戶的is_active參數(shù)變?yōu)?
user.is_active = 1
user.save()
# 跳轉(zhuǎn)到登錄界面
return redirect(reverse('user:login'))
except SignatureExpired as e:
# 激活鏈接已經(jīng)過期
return HttpResponse('激活鏈接已過期!')
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python和websocket構(gòu)建實時日志跟蹤器的步驟
這篇文章主要介紹了python和websocket構(gòu)建實時日志跟蹤器的步驟,幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下2021-04-04
深入理解python中sort()與sorted()的區(qū)別
Python list內(nèi)置sort()方法用來排序,也可以用python內(nèi)置的全局sorted()方法來對可迭代的序列排序生成新的序列。這篇文章主要介紹了python中sort()與sorted()的區(qū)別,需要的朋友可以參考下2018-08-08
Python使用Nocalhost并開啟debug調(diào)試的方法
Nocalhost是一種開發(fā)者工具,支持針對Kubernetes應用程序進行調(diào)試和部署,這篇文章主要介紹了Python怎么使用Nocalhost并開啟debug,需要的朋友可以參考下2023-04-04
Python基于codecs模塊實現(xiàn)文件讀寫案例解析
這篇文章主要介紹了Python基于codecs實現(xiàn)文件讀寫案例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-05-05

