1.發(fā)郵件配置
我使用的騰訊企業(yè)郵箱來發(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 = '注冊激活鏈接'
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>