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