1、Install django-simple-captcha via pip: pip install django-simple-captcha
2、Add captcha to the INSTALLED_APPS in your settings.py
3、Run python manage.py migrate
4、Add an entry to your urls.py:
urlpatterns = [ url(r\\\’^captcha/\\\’, include(\\\’captcha.urls\\\’)), ] 添加驗(yàn)證嗎 在app.form中建立register_form表單,定義好注冊(cè)需要的字段(form可自動(dòng)生成input框)【form實(shí)現(xiàn)了后臺(tái)與前端的交互】
class RegisterForm(forms.Form): Email = forms.EmailField(required=True) Password = forms.CharField(required=True,min_length=5) captcha = CaptchaField() 將form加入RegisterView視圖中,并將form數(shù)據(jù)傳入Template中
class RegisterView(View): def get(self,request): register_form = RegisterForm() return render(request,\\\’register.html\\\’,{\\\’register_form\\\’:register_form}) #將register_form數(shù)據(jù)傳遞給Template 通過Template將register_form傳入html中,生成驗(yàn)證碼(form數(shù)據(jù)可通過Template自動(dòng)生成input框)
<div class=”form-group marb8 captcha1 “> <label>驗(yàn) 證 碼</label> {{ register_form.captcha }} </div> 完成注冊(cè)的后臺(tái)邏輯,get方法用于刷新,post方法用于接受用戶信息并進(jìn)行存儲(chǔ)
class RegisterView(View): def get(self,request): register_form = RegisterForm() return render(request,\\\’register.html\\\’,{\\\’register_form\\\’:register_form}) #將register_form數(shù)據(jù)傳遞給Template def post(self, request): register_form = RegisterForm(request.POST) #將post上來的數(shù)據(jù)傳遞給RegisterForm if register_form.is_valid(): #上傳的數(shù)據(jù)符合form表要求,有效 user_name = request.POST.get(\\\’username\\\’,\\\’\\\’) if UserProfile.objects.filter(email=user_name): return render(request, \\\’register.html\\\’, {\\\’register_form\\\’:register_form,\\\’msg\\\’: \\\’用戶已存在\\\’}) # 該邏輯用戶判斷用戶是否已注冊(cè)存在 pass_word = request.POST.get(\\\’password\\\’,\\\’\\\’) user_profile = UserProfile() user_profile.username = user_name user_profile.email = user_name #明文數(shù)據(jù)需要經(jīng)過加密后傳入數(shù)據(jù)庫,利用make_password方法加密 user_profile.password = make_password(pass_word) user_profile.save() else: return render(request, \\\’register.html\\\’, {\\\’register_form\\\’: register_form}) # 將register_form數(shù)據(jù)傳遞給Template 注意html中相同的、多余的input會(huì)影響文本輸出 將value傳回Template中
<input type=”text” id=”id_email” name=”email” value=”{{ register_form.email.value }}” placeholder=”請(qǐng)輸入您的郵箱地址” /> <input type=”password” id=”id_password” name=”password” value=”{{ register_form.password.value }}” placeholder=”請(qǐng)輸入6-20位非中文字符密碼” /> 通過郵箱發(fā)送驗(yàn)證鏈接進(jìn)行注冊(cè)激活 Django 使用 QQ / 新浪郵箱發(fā)送郵件配置 創(chuàng)建utils文件夾,用于存放工具函數(shù)/類
from users.models import EmailVerifyCode from random import Random from django.core.mail import send_mail from GMOOC.settings import EMAIL_HOST,EMAIL_PORT,EMAIL_HOST_USER,EMAIL_HOST_PASSWORD,EMAIL_USE_TLS,EMAIL_FROM 用于生成隨機(jī)生成驗(yàn)證嗎,長度可調(diào)
#隨機(jī)生成驗(yàn)證嗎,長度可調(diào) def random_str(random_length=8): code = \\\’\\\’ chars = \\\’ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890\\\’ random = Random() length = len(chars)-1 for i in random_length: code = chars[random.randint(0,length)] return code 用于生成隨機(jī)驗(yàn)證碼和對(duì)應(yīng)的郵箱并存入數(shù)據(jù)庫中,將驗(yàn)證碼以鏈接形式發(fā)送至郵箱,點(diǎn)擊進(jìn)行激活
def send_register_email(email, send_type=\\\’register\\\’): ###########################生成隨機(jī)驗(yàn)證碼存入數(shù)據(jù)庫中########################### #繼承模型 email_record = EmailVerifyCode() code = random_str(16) #將隨機(jī)生成code存入數(shù)據(jù)庫中 email_record.code = code #將管理的郵箱傳入數(shù)據(jù)庫中 email_record.email = email #定義發(fā)送類型 email_record.send_type = send_type email_record.save() ###########################發(fā)送激活郵件########################### email_title = \\\’\\\’ email_body = \\\’\\\’ receive_email = email if send_type == \\\’register\\\’: email_title = \\\’慕學(xué)在線激活連接\\\’ email_body = \\\’請(qǐng)點(diǎn)擊下方連接,激活注冊(cè):\\\’ \\\’http://127.0.0.1:8000/active/{0}\\\’.format(code) if send_type ==\\\’find_password\\\’: email_title = \\\’慕學(xué)在線密碼找回連接\\\’ email_body = \\\’請(qǐng)點(diǎn)擊下方連接,進(jìn)行密碼找回:\\\’ \\\’http://127.0.0.1:8000/active/{0}\\\’.format(code) send_status = send_mail(email_title, email_body, EMAIL_FROM, [receive_email]) 將注冊(cè)頁上傳上來的信息保存值UserProfile,但是is_active還是0,表示還未進(jìn)行激活。完成注冊(cè)后跳轉(zhuǎn)至登陸頁面,注冊(cè)失敗的仍停留在注冊(cè)頁
class RegisterView(View): def get(self,request): register_form = RegisterForm() return render(request,\\\’register.html\\\’,{\\\’register_form\\\’:register_form}) #將register_form數(shù)據(jù)傳遞給Template #return render(request,\\\’register.html\\\’,{}) def post(self, request): register_form = RegisterForm(request.POST) #將post上來的數(shù)據(jù)傳遞給RegisterForm if register_form.is_valid(): #上傳的數(shù)據(jù)符合form表要求,有效 user_name = request.POST.get(\\\’email\\\’,\\\’\\\’) pass_word = request.POST.get(\\\’password\\\’,\\\’\\\’) ########注冊(cè)的時(shí)候需要查看郵箱是否有重復(fù),利用了username進(jìn)行了去重####### user_profile = UserProfile() user_profile.username = user_name user_profile.email = user_name #明文數(shù)據(jù)需要經(jīng)過加密后傳入數(shù)據(jù)庫,利用make_password方法加密 user_profile.password = make_password(pass_word) user_profile.is_active = 0 #表面用戶還未激活 user_profile.save() #用于郵件激活操作 send_register_email(user_name, send_type=\\\’register\\\’) return render(request, \\\’login.html\\\’, {}) # 將register_form數(shù)據(jù)傳遞給Template else: #注冊(cè)失敗跳轉(zhuǎn)至index頁面,暫時(shí) #return render(request,\\\’index.html\\\’,{}) return render(request, \\\’register.html\\\’, {\\\’register_form\\\’:register_form}) # 將register_form數(shù)據(jù)傳遞給Template 在url中,通過(?P.*)正則獲取獲取匹配的字符串(實(shí)際就是發(fā)送的驗(yàn)證碼),綁定ActiveUserView,通過該類完成激活
url(r\\\’^active/(?P<active_code>.*)/$\\\’,ActiveUserView.as_view(),name=\\\’active_user\\\’) ActiveUserView原理就是通過get,獲取激活的請(qǐng)求,通過驗(yàn)證碼在EmailVerifyCode中查詢到對(duì)應(yīng)的郵箱,通過郵箱在UserProfile查詢到對(duì)應(yīng)的賬號(hào)信息,并將is_active 變?yōu)?,即完成激活
class ActiveUserView(View): def get(self,request,active_code): #利用code在EmailVerifyCode進(jìn)行查詢 EmailVerifyCodeRecorder = EmailVerifyCode.objects.filter(code=active_code) if EmailVerifyCodeRecorder: #找到UserProfile中的對(duì)應(yīng)賬號(hào),并設(shè)is_active為1,即為激活賬號(hào) for i in EmailVerifyCodeRecorder: email = i.email user = UserProfile.objects.get(email=email) user.is_active = 1 user.save() return render(request, \\\’login.html\\\’, {}) # 將register_form數(shù)據(jù)傳遞給Template else: return render(request, \\\’active_fail.html\\\’, {}) #找不到記錄則返回連接失效的頁面 密碼找回 在Template中設(shè)置忘記密碼的跳轉(zhuǎn)
<a class=”fr” href=”{% url \\\’forgetpwd\\\’ %}”>忘記密碼?</a> 在url中定義forgetpwd頁面
url(r\\\’^forgetpwd/$\\\’, ForgetpwdView.as_view(), name=\\\’forgetpwd\\\’), 定義ForgetpwdForm
class ForgetpwdForm(forms.Form): email = forms.EmailField(required=True) captcha = CaptchaField(error_messages={\\\’invalid\\\’:u\\\’驗(yàn)證碼錯(cuò)誤\\\’}) 將form的驗(yàn)證碼form傳入html中,并配置好靜態(tài)文件
#html中配置驗(yàn)證碼 {{ forgetpwd_form.captcha }} 發(fā)送郵箱的函數(shù)
def send_email(email, send_type=\\\’register\\\’): ###########################生成隨機(jī)驗(yàn)證碼存入數(shù)據(jù)庫中########################### #繼承模型 email_record = EmailVerifyCode() code = random_str(16) #將隨機(jī)生成code存入數(shù)據(jù)庫中 email_record.code = code #將管理的郵箱傳入數(shù)據(jù)庫中 email_record.email = email #定義發(fā)送類型 email_record.send_type = send_type email_record.save() ###########################發(fā)送激活郵件########################### email_title = \\\’\\\’ email_body = \\\’\\\’ receive_email = email if send_type == \\\’register\\\’: email_title = \\\’慕學(xué)在線激活連接\\\’ email_body = \\\’請(qǐng)點(diǎn)擊下方連接,激活注冊(cè):\\\’ \\\’http://127.0.0.1:8000/active/{0}\\\’.format(code) if send_type ==\\\’find_password\\\’: email_title = \\\’慕學(xué)在線密碼找回連接\\\’ email_body = \\\’請(qǐng)點(diǎn)擊下方連接,進(jìn)行密碼找回:\\\’ \\\’http://127.0.0.1:8000/password_reset/{0}\\\’.format(code) send_status = send_mail(email_title, email_body, EMAIL_FROM, [receive_email]) 在view中定義ForgetpwdView后臺(tái)邏輯
class ForgetpwdView(View): def get(self,request): forgetpwd_form = ForgetpwdForm() return render(request,\\\’forgetpwd.html\\\’,{\\\’forgetpwd_form\\\’:forgetpwd_form}) #將驗(yàn)證碼傳遞給前端 def post(self,request): forgetpwd_form = ForgetpwdForm(request.POST) if forgetpwd_form.is_valid(): #post數(shù)據(jù)成功,將驗(yàn)證碼保存在EmailVerifyCode,用于激活查詢,并跳轉(zhuǎn)至index頁面 email = request.POST.get(\\\’email\\\’) send_email(email, send_type=\\\’find_password\\\’) return render(request,\\\’index.html\\\’,{}) else: #驗(yàn)證碼錯(cuò)誤或郵箱格式錯(cuò)誤返回信息 return render(request,\\\’forgetpwd.html\\\’,{\\\’forgetpwd_form\\\’:forgetpwd_form}) 注意form表單的變量名稱要與html中的name保持一直, forgetpwd_form = ForgetpwdForm(request.POST)才能匹配 編寫修改密碼連接的url,綁定PasswordReset
url(r\\\’^password_reset/(?P<active_code>.*)/$\\\’, PasswordReset.as_view(), name=\\\’password_reset\\\’), 編寫修改密碼的后臺(tái)邏輯 打開連接,后臺(tái)自動(dòng)獲取相對(duì)唯一的active_code,通過active_code在EmailVerifyCode中找到對(duì)應(yīng)的email,通過email在UserProfile中找到對(duì)應(yīng)的用戶信息,符合條件則修改用戶密碼。
class PasswordReset(View): def get(self,request,active_code): return render(request,\\\’password_reset.html\\\’,{}) #獲取修改密碼頁面 def post(self,request,active_code): EmailVerifyCodeRecorder = EmailVerifyCode.objects.filter(code=active_code) #通過active_code去EmailVerifyCode找到對(duì)應(yīng)的email if EmailVerifyCodeRecorder: #如果該驗(yàn)證碼存在 # 找到UserProfile中的對(duì)應(yīng)賬號(hào),進(jìn)行修改密碼 for i in EmailVerifyCodeRecorder: #一般來說該驗(yàn)證碼是唯一的 email = i.email #找到email user = UserProfile.objects.get(email=email) #通過email在UserProfile中找到對(duì)應(yīng)的用戶數(shù)據(jù) password_reset = PasswordResetForm(request.POST) #新密碼上傳至表單中 if password_reset.is_valid(): #新設(shè)置的密碼符合表單的話 password = request.POST.get(\\\’password\\\’,\\\’\\\’) password2 = request.POST.get(\\\’password2\\\’,\\\’\\\’) if password == password2: #兩個(gè)密碼相同,所有邏輯正確,進(jìn)行密碼修改 #在數(shù)據(jù)庫中信息密碼修改 user.password = make_password(password) user.save() return render(request, \\\’login.html\\\’, {}) # 將register_form數(shù)據(jù)傳遞給Template else: #如果兩個(gè)密碼不相同 return render(request, \\\’password_reset.html\\\’, {\\\’msg\\\’:\\\’兩個(gè)密碼不一致\\\’}) # 將register_form數(shù)據(jù)傳遞給Template else: #表單驗(yàn)證不通過 return render(request, \\\’password_reset.html\\\’, {\\\’msg\\\’:\\\’密碼未填寫或格式有問題\\\’}) else: pass #返回404頁面 Template的修改
1.靜態(tài)文件配置:{% static \\\’name\\\’ %} 2.url的配置:{% url \\\’name\\\’ %} 3.錯(cuò)誤信息提示: <div class=”error btns” id=”jsForgetTips”>{% for key,error in forgetpwd_form.errors.items %}{{ error }}{% endfor %}</div> 4.錯(cuò)誤信息聚焦: <div class=”form-group marb20 {% if forgetpwd_form.errors.email %}errorput{% endif %}”> 5.值回填 <input type=”text” id=”account” name=”email” value=”{{ forgetpwd_form.email.value }}” placeholder=”郵箱” /> 用戶退出
用戶退出
前端配置“注銷按鈕”的觸發(fā)邏輯:單機(jī)“退出”跳轉(zhuǎn)至user_loginout的url中
<a class=”fr” href=”{% url \\\’user_loginout\\\’ %}”>退出</a> 在url中定義好視圖邏輯
url(r\\\’^loginout/$\\\’, logout_view, name=\\\’user_loginout\\\’), 在view中定義好logout_view函數(shù)的邏輯,利用系統(tǒng)logout函數(shù)清除request的登陸信息
from django.contrib.auth import authenticate,login,logout def logout_view(request): logout(request) return render(request, \\\’index.html\\\’, {}) # 登陸成功,由后臺(tái)渲染跳轉(zhuǎn)至index,并在index中判斷,頭部顯示
如果,你對(duì)上面的內(nèi)容還有疑問,推薦選擇西部數(shù)碼企業(yè)云郵箱!有專人協(xié)助您解答郵箱疑問。
西部數(shù)碼優(yōu)質(zhì)企業(yè)郵箱服務(wù)商,提供安全穩(wěn)定,簡單易用,高性價(jià)比的企業(yè)郵箱。按需自由定制,不限空間,極速收發(fā),能夠滿足用戶對(duì)企業(yè)郵箱的不同需求。多種反垃圾郵件算法,99.9%精準(zhǔn)度,智能過濾,減少垃圾郵件干擾。支持小程序收發(fā)郵件,隨時(shí)隨地移動(dòng)辦公。而且價(jià)格實(shí)惠,還可以免費(fèi)試用,7×24小時(shí)專業(yè)團(tuán)隊(duì)服務(wù)支持!
高性價(jià)比企業(yè)郵箱開通鏈接:http://www.bingfeng168.cn/services/mail/