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


在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 = '注冊(cè)激活鏈接'
email_body = '請(qǐng)點(diǎn)擊下面的鏈接激活你的賬號(hào): 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 = '請(qǐng)點(diǎn)擊下面的鏈接重置你的密碼: 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 = '郵箱修改驗(yàn)證碼'
email_body = '你的郵箱驗(yàn)證碼為:{0}'.format(code)
send_status = send_mail(email_title, email_body, EMAIL_HOST_USER, [email])
if send_status:
pass
在views.py中的注冊(cè)view類(lèi)中添加發(fā)送郵件的使用
from utils.email_send import send_email
//example@example.com接收者郵箱
send_email(“example@example.com”, 'register')
2.驗(yàn)證碼的使用
首先需要在虛擬環(huán)境中安裝‘django-simple-captcha’和‘pillow’
pip install django-simple-captcha 用于驗(yàn)證碼
pip install pillow 圖像處理
然后在settings.py中的“INSTALLED_APPS”添加“ 'captcha', ”
分別執(zhí)行一次“makemigrations”和“migration”
在RegisterForm中添加檢測(cè)項(xiàng)
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' : '驗(yàn)證碼錯(cuò)誤'})
在html中使用的位置添加
<div>
<label>驗(yàn) 證 碼</label>
{{ register_form.captcha }}
</div>
3.頁(yè)面class
之前寫(xiě)頁(yè)面是通過(guò)方法
# 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':'用戶(hù)名或者密碼錯(cuò)誤'})
elif request.method == 'GET':
return render(request,'login.html',{})
也可通過(guò)下面的方式
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' : '用戶(hù)未激活'})
else:
return render(request, 'login.html', {'msg' : '用戶(hù)名或密碼錯(cuò)誤'})
else:
return render(request, 'login.html', {'login_form' : login_form})
LoginForm可以省去上面方法或者類(lèi)中對(duì)于表單提交的參數(shù)的處理邏輯
from django import forms
class LoginForm(forms.Form):
username = forms.CharField(required=True) #required=True 表示不可為空
password = forms.CharField(required=True, min_length=5)
上面兩種登錄頁(yè)面的方式在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.登錄和注冊(cè)
在項(xiàng)目的中的登錄和注冊(cè)中需要調(diào)用系統(tǒng)的登錄和注冊(cè)方法
導(dǎo)入“from django.contrib.auth import authenticate, login, logout”
user = authenticate(username=user_name, password=pass_word)//驗(yàn)證賬號(hào)密碼是否正確
if user is not None://表示賬號(hào)密碼正確然后調(diào)用系統(tǒng)的“l(fā)ogin(request,user)”達(dá)到登錄效果
退出的時(shí)候只需調(diào)用“l(fā)ogout(request)”即可
5.忘記密碼-重置
重置密碼的邏輯是首先輸入郵箱提交申請(qǐng),然后點(diǎn)擊郵箱收到的鏈接,在鏈接中有標(biāo)示用戶(hù)的信息,查找得到用戶(hù)的郵箱后將郵箱傳遞到輸入密碼的頁(yè)面,然后將兩次輸入的密碼和郵箱地址一塊傳遞到重置密碼的處理邏輯中
通過(guò)下面代碼來(lái)傳遞郵箱
return render(request, 'password_reset.html', {'email' : email})
設(shè)置密碼的頁(yè)面
<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>