Django實戰(zhàn)項目- 發(fā)郵件 注冊 登錄 退出 忘記密碼(3)

1.發(fā)郵件配置

我使用的騰訊企業(yè)郵箱來發(fā)送郵件环凿,首先需要登錄郵箱確保權(quán)限的設(shè)置讥电,如下圖


image

image

在settings.py中添加郵箱配置

#配置郵箱發(fā)送者
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'   #email后端
EMAIL_USE_TLS = False   #是否使用TLS安全傳輸協(xié)議
EMAIL_USE_SSL = True     #是否使用SSL加密,qq企業(yè)郵箱要求使用
EMAIL_HOST = 'smtp.exmail.qq.com'    #發(fā)送郵件的郵箱 的 SMTP服務(wù)器猜年,這里用了qq企業(yè)郵箱
EMAIL_PORT = 465    #發(fā)件箱的SMTP服務(wù)器端口
EMAIL_HOST_USER = 'liyong@7xiaofu.com'  #發(fā)送郵件的郵箱地址
EMAIL_HOST_PASSWORD = 'XXXXXX'  #發(fā)送郵件的郵箱密碼
DEFAULT_FORM_EMAIL = 'liyong <liyong@7xiaofu.com>'

在apps路徑下創(chuàng)建’utils‘python package文件夾抡锈,并創(chuàng)建email_send.py文件
需要引入系統(tǒng)的“from django.core.mail import send_mail”
代碼如下

from random import Random
from django.core.mail import send_mail

from users.models import EmailVerifyRecord
from MxOnline.settings import EMAIL_HOST_USER


def random_str(randomlength=8):
str = ''
chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
length = len(chars) - 1
random = Random()
for i in range(randomlength):
str += chars[random.randint(0, length)]
return str


def send_email(email, send_type='register'):
email_record = EmailVerifyRecord()
if send_type == 'update_email':
code = random_str(4)
else:
code = random_str(16)
email_record.code = code
email_record.email = email
email_record.send_type = send_type
email_record.save()

email_title = ''
email_body = ''
if send_type == 'register':
email_title = '注冊激活鏈接'
email_body = '請點擊下面的鏈接激活你的賬號: http://127.0.0.1:8000/active/{0}'.format(code)

send_status = send_mail(email_title,email_body,EMAIL_FROM,[email])
if send_status:
pass
elif send_type == 'forget':
email_title = '密碼重置鏈接'
email_body = '請點擊下面的鏈接重置你的密碼: http://127.0.0.1:8000/reset/{0}'.format(code)

send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])
if send_status:
pass
elif send_type == 'forget':
email_title = '郵箱修改驗證碼'
email_body = '你的郵箱驗證碼為:{0}'.format(code)

send_status = send_mail(email_title, email_body, EMAIL_HOST_USER, [email])
if send_status:
pass

在views.py中的注冊view類中添加發(fā)送郵件的使用

from utils.email_send import send_email
//example@example.com接收者郵箱
send_email(“example@example.com”, 'register')

2.驗證碼的使用

首先需要在虛擬環(huán)境中安裝‘django-simple-captcha’和‘pillow’

pip install django-simple-captcha 用于驗證碼
pip install pillow 圖像處理

然后在settings.py中的“INSTALLED_APPS”添加“ 'captcha', ”
分別執(zhí)行一次“makemigrations”和“migration”

在RegisterForm中添加檢測項

from captcha.fields import CaptchaField


class RegisterForm(forms.Form):
email = forms.EmailField(required=True)
password = forms.CharField(required=True, min_length=5)
captcha = CaptchaField(error_messages={'invalid' : '驗證碼錯誤'})

在html中使用的位置添加

<div>
<label>驗 證 碼</label>
{{ register_form.captcha }}
</div>

3.頁面class

之前寫頁面是通過方法

# login in method
def user_login(request):
if request.method == 'POST':
username = request.POST.get('username','')
password = request.POST.get('password','')

user = authenticate(username=username, password=password)
if user is not None:
login(request,user)
return render(request, 'index.html')
else:
return render(request, 'login.html',{'msg':'用戶名或者密碼錯誤'})
elif request.method == 'GET':
return render(request,'login.html',{})

也可通過下面的方式

from django.views.generic.base import View


# login in class 登錄
class LoginView(View):
def get(self,request):
return render(request, 'login.html',{})
def post(self,request):
login_form = LoginForm(request.POST)
if login_form.is_valid():
user_name = request.POST.get('username', '')
pass_word = request.POST.get('password', '')
user = authenticate(username=user_name, password=pass_word)
if user is not None:
if user.is_active:
login(request,user)
return render(request, 'index.html')
else:
return render(request, 'login.html', {'msg' : '用戶未激活'})
else:
return render(request, 'login.html', {'msg' : '用戶名或密碼錯誤'})
else:
return render(request, 'login.html', {'login_form' : login_form})

LoginForm可以省去上面方法或者類中對于表單提交的參數(shù)的處理邏輯

from django import forms


class LoginForm(forms.Form):
username = forms.CharField(required=True) #required=True 表示不可為空
password = forms.CharField(required=True, min_length=5)

上面兩種登錄頁面的方式在urls中的區(qū)別,分別為:

user_login:
from users.views import user_login
url(r'^login/$', user_login, name='login'),

LoginView:
from users.views import LoginView
from django.views.generic import TemplateView
url(r'^login/$', LoginView.as_view(), name='login'),

4.登錄和注冊

在項目的中的登錄和注冊中需要調(diào)用系統(tǒng)的登錄和注冊方法
導(dǎo)入“from django.contrib.auth import authenticate, login, logout”

user = authenticate(username=user_name, password=pass_word)//驗證賬號密碼是否正確
if user is not None://表示賬號密碼正確然后調(diào)用系統(tǒng)的“l(fā)ogin(request,user)”達(dá)到登錄效果

退出的時候只需調(diào)用“l(fā)ogout(request)”即可

5.忘記密碼-重置

重置密碼的邏輯是首先輸入郵箱提交申請乔外,然后點擊郵箱收到的鏈接床三,在鏈接中有標(biāo)示用戶的信息,查找得到用戶的郵箱后將郵箱傳遞到輸入密碼的頁面杨幼,然后將兩次輸入的密碼和郵箱地址一塊傳遞到重置密碼的處理邏輯中
通過下面代碼來傳遞郵箱

return render(request, 'password_reset.html', {'email' : email})

設(shè)置密碼的頁面

<li>
<span class="">新 密 碼 :</span>
<input type="password" name="password" id="pwd" placeholder="6-20位非中文字符">
<i></i>
</li>
<li>
<span class="">確定密碼:</span>
<input type="password" name="password2" id="repwd" placeholder="6-20位非中文字符">
<i></i>
</li>
<li>
<input type="hidden" name="email" value="{{ email }}">
</li>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末撇簿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子差购,更是在濱河造成了極大的恐慌四瘫,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欲逃,死亡現(xiàn)場離奇詭異找蜜,居然都是意外死亡,警方通過查閱死者的電腦和手機稳析,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門洗做,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弓叛,“玉大人,你說我怎么就攤上這事诚纸∽辏” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵畦徘,是天一觀的道長毕籽。 經(jīng)常有香客問我,道長旧烧,這世上最難降的妖魔是什么影钉? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮掘剪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奈虾。我一直安慰自己夺谁,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布肉微。 她就那樣靜靜地躺著匾鸥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碉纳。 梳的紋絲不亂的頭發(fā)上勿负,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機與錄音劳曹,去河邊找鬼奴愉。 笑死,一個胖子當(dāng)著我的面吹牛铁孵,可吹牛的內(nèi)容都是我干的锭硼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蜕劝,長吁一口氣:“原來是場噩夢啊……” “哼檀头!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起岖沛,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤暑始,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后婴削,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體廊镜,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年馆蠕,在試婚紗的時候發(fā)現(xiàn)自己被綠了期升。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惊奇。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖播赁,靈堂內(nèi)的尸體忽然破棺而出颂郎,到底是詐尸還是另有隱情,我是刑警寧澤容为,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布乓序,位于F島的核電站,受9級特大地震影響坎背,放射性物質(zhì)發(fā)生泄漏替劈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一得滤、第九天 我趴在偏房一處隱蔽的房頂上張望陨献。 院中可真熱鬧,春花似錦懂更、人聲如沸眨业。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽龄捡。三九已至,卻和暖如春慷暂,著一層夾襖步出監(jiān)牢的瞬間聘殖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工行瑞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奸腺,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓蘑辑,卻偏偏與公主長得像洋机,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子洋魂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容