Django+xadmin打造線上教育平臺(三)
目錄
程式碼
五、使用者註冊
主要實現功能
- 使用者輸入郵箱、密碼和驗證碼,點註冊按鈕
- 如果輸入的不正確,提示錯誤資訊
- 如果正確,傳送啟用郵件,使用者通過郵件啟用後才能登陸
- 即使註冊成功,沒有啟用的使用者也不能登陸
5.1.初步檢視
users/views.py
class RegisterView(View): '''使用者註冊''' def get(self,request): return render(request,'register.html')
使用者以get方式,直接返回註冊頁面
5.2.路由設計
# MxOnline/urls.py from users.views import RegisterView path('register/',RegisterView.as_view(),name = 'register'),
urls中。通過類的as_view方法,呼叫這個View類
5.3.模板修改
修改index.html
點 “註冊 ”應該跳到使用者註冊頁面
<a style="color:white" class="fr registerbtn" href="/register/">註冊</a><a style="color:white" class="fr loginbtn" href="/login/">登入</a>
修改register.html中的靜態檔案地址
{% load staticfiles %} <link rel="stylesheet" type="text/css" href="{% static 'css/reset.css' %}"> <link rel="stylesheet" type="text/css" href="{% static 'css/login.css' %}"> . . .<script src="{% static 'js/jquery.min.js' %}" type="text/javascript"></script> <script src="{% static 'js/unslider.js' %}" type="text/javascript"></script> <script src="{% static 'js/validateDialog.js' %}" type="text/javascript"></script> <script src="{% static 'js/login.js' %}" type="text/javascript"></script>
測試一下從index介面點註冊能不能跳到register介面
5.4.驗證碼
安裝:
pip install django-simple-captcha
Add captcha
to the INSTALLED_APPS
in your settings.py
INSTALLED_APPS = [ 'captcha', ]
Add an entry to your urls.py
:
urlpatterns = [ path('captcha/',include('captcha.urls')), ]
生成到資料庫
python manage.py makemigrations
python manage.py migrate
可以看到資料庫多了一張表
在註冊頁面顯示驗證碼
定義我們的register form:
# users/forms.py from captcha.fields import CaptchaField class RegisterForm(forms.Form): '''註冊驗證表單''' email = forms.EmailField(required=True) password = forms.CharField(required=True,min_length=5) # 驗證碼,欄位裡面可以自定義錯誤提示資訊 captcha = CaptchaField()
# users/forms.py from django import forms from captcha.fields import CaptchaField class LoginForm(forms.Form): '''登入驗證表單''' username = forms.CharField(required=True) password = forms.CharField(required=True,min_length=5) class RegisterForm(forms.Form): '''註冊驗證表單''' email = forms.EmailField(required=True) password = forms.CharField(required=True,min_length=5) # 驗證碼 captcha = CaptchaField(error_messages={'invalid':'驗證碼錯誤'})forms.py
通過{{ register_form.captcha }}獲取驗證碼
<div class="form-group marb8 captcha1 "> <label>驗 證 碼</label> {{ register_form.captcha }} </div>
5.5.完善註冊的後臺邏輯
class RegisterView(View): '''使用者註冊''' def get(self,request): register_form = RegisterForm() return render(request,'register.html',{'register_form':register_form}) def post(self,request): register_form = RegisterForm(request.POST) if register_form.is_valid(): user_name = request.POST.get('email', None) # 如果使用者已存在,則提示錯誤資訊 if UserProfile.objects.filter(email = user_name): return render(request, 'register.html', {'register_form':register_form,'msg': '使用者已存在'}) pass_word = request.POST.get('password', None) # 例項化一個user_profile物件 user_profile = UserProfile() user_profile.username = user_name user_profile.email = user_name user_profile.is_active = False # 對儲存到資料庫的密碼加密 user_profile.password = make_password(pass_word) user_profile.save() send_register_eamil(user_name,'register') return render(request,'login.html') else: return render(request,'register.html',{'register_form':register_form})
# users/views.py from django.shortcuts import render from django.contrib.auth import authenticate,login from django.contrib.auth.backends import ModelBackend from .models import UserProfile,EmailVerifyRecord from django.db.models import Q from django.views.generic.base import View from .forms import LoginForm,RegisterForm from django.contrib.auth.hashers import make_password from utils.email_send import send_register_eamil #郵箱和使用者名稱都可以登入 # 基礎ModelBackend類,因為它有authenticate方法 class CustomBackend(ModelBackend): def authenticate(self, request, username=None, password=None, **kwargs): try: # 不希望使用者存在兩個,get只能有一個。兩個是get失敗的一種原因 Q為使用並集查詢 user = UserProfile.objects.get(Q(username=username)|Q(email=username)) # django的後臺中密碼加密:所以不能password==password # UserProfile繼承的AbstractUser中有def check_password(self, raw_password): if user.check_password(password): return user except Exception as e: return None 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', None) pass_word = request.POST.get('password', None) # 成功返回user物件,失敗None user = authenticate(username=user_name, password=pass_word) # 如果不是null說明驗證成功 if user is not None: if user.is_active: # 只有註冊啟用才能登入 login(request, user) return render(request, 'index.html') else: return render(request, 'login.html', {'msg': '使用者名稱或密碼錯誤', 'login_form': login_form}) # 只有當用戶名或密碼不存在時,才返回錯誤資訊到前端 else: return render(request, 'login.html', {'msg': '使用者名稱或密碼錯誤','login_form':login_form}) # form.is_valid()已經判斷不合法了,所以這裡不需要再返回錯誤資訊到前端了 else: return render(request,'login.html',{'login_form':login_form}) # 啟用使用者 class ActiveUserView(View): def get(self, request, active_code): # 查詢郵箱驗證記錄是否存在 all_record = EmailVerifyRecord.objects.filter(code = active_code) if all_record: for record in all_record: # 獲取到對應的郵箱 email = record.email # 查詢到郵箱對應的user user = UserProfile.objects.get(email=email) user.is_active = True user.save() # 驗證碼不對的時候跳轉到啟用失敗頁面 else: return render(request,'active_fail.html') # 啟用成功跳轉到登入頁面 return render(request, "login.html", ) class RegisterView(View): '''使用者註冊''' def get(self,request): register_form = RegisterForm() return render(request,'register.html',{'register_form':register_form}) def post(self,request): register_form = RegisterForm(request.POST) if register_form.is_valid(): user_name = request.POST.get('email', None) # 如果使用者已存在,則提示錯誤資訊 if UserProfile.objects.filter(email = user_name): return render(request, 'register.html', {'register_form':register_form,'msg': '使用者已存在'}) pass_word = request.POST.get('password', None) # 例項化一個user_profile物件 user_profile = UserProfile() user_profile.username = user_name user_profile.email = user_name user_profile.is_active = False # 對儲存到資料庫的密碼加密 user_profile.password = make_password(pass_word) user_profile.save() send_register_eamil(user_name,'register') return render(request,'login.html') else: return render(request,'register.html',{'register_form':register_form})views.py所以程式碼
說明:
- 如果是get請求,直接返回註冊頁面給使用者
- 如果是post請求,先生成一個表單例項,並獲取使用者提交的所有資訊(request.POST)
- is_valid()方法,驗證使用者的提交資訊是不是合法
- 如果合法,獲取使用者提交的email和password
- 例項化一個user_profile物件,把使用者新增到資料庫
- 預設新增的使用者是啟用狀態(is_active=1表示True),在這裡我們修改預設的狀態(改為is_active = False),只有使用者去郵箱啟用之後才改為True
- 對密碼加密,然後儲存,傳送郵箱,username是使用者註冊的郵箱,‘register’表明是註冊
- 註冊成功跳轉到登入介面
5.6.傳送啟用郵件
在Python中已經內建了一個smtp郵件傳送模組,Django在此基礎上進行了簡單地封裝,讓我們在Django環境中可以更方便更靈活的傳送郵件。
所有的功能都在django.core.mail中。
首先settings裡面設定
# settings.py EMAIL_HOST = "smtp.qq.com" # SMTP伺服器主機 EMAIL_PORT = 25 # 埠 EMAIL_HOST_USER = "[email protected]" # 郵箱地址 EMAIL_HOST_PASSWORD = "dwjybikexxxxxxxx" # 密碼 EMAIL_USE_TLS= True EMAIL_FROM = "[email protected]" # 郵箱地址
說明:
EMAIL_HOST = "smtp.qq.com"
EMAIL_HOST_PASSWORD = "dwjybikexxxxxxxx"
要想用qq郵箱作為伺服器傳送郵件,必須先開啟SMTP,方法如下:
1)登入郵箱,找到“設定”-->>“使用者”
2)往下拉找到SMTP服務,點開啟,然後點“生成授權碼”
3)可以看到授權碼,“EMAIL_HOST_PASSWORD”裡面填寫的就是下面生成的授權碼,而不是你的郵箱密碼
在apps目錄新建package utils,然後新建一個email_send.py檔案
# apps/utils/email_send.py from random import Random from django.core.mail import send_mail from users.models import EmailVerifyRecord from MxOnline.settings import EMAIL_FROM # 生成隨機字串 def random_str(random_length=8): str = '' # 生成字串的可選字串 chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789' length = len(chars) - 1 random = Random() for i in range(random_length): str += chars[random.randint(0, length)] return str # 傳送註冊郵件 def send_register_eamil(email, send_type="register"): # 傳送之前先儲存到資料庫,到時候查詢連結是否存在 # 例項化一個EmailVerifyRecord物件 email_record = EmailVerifyRecord() # 生成隨機的code放入連結 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 = "NBA註冊啟用連結" email_body = "請點選下面的連結啟用你的賬號: http://127.0.0.1:8000/active/{0}".format(code) # 使用Django內建函式完成郵件傳送。四個引數:主題,郵件內容,發件人郵箱地址,收件人(是一個字串列表) send_status = send_mail(email_title, email_body, EMAIL_FROM, [email]) # 如果傳送成功 if send_status: pass
官方文件:
def send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None, connection=None, html_message=None):
前面四個引數必須要,後面的引數可以為空
傳送電子郵件的最簡單方法是使用 django.core.mail.send_mail()
。
的subject
,message
,from_email
和recipient_list
引數是必需的。
subject
:一個字串。message
:一個字串。from_email
:一個字串。recipient_list
:字串列表,每個字串都是電子郵件地址。每個成員都recipient_list
將在電子郵件的“收件人:”欄位中看到其他收件人。fail_silently
:一個布林值。如果是的話False
,send_mail
會提出一個smtplib.SMTPException
。有關smtplib
可能的例外列表,請參閱文件,所有這些例外都是。的子類SMTPException
。auth_user
:用於向SMTP伺服器進行身份驗證的可選使用者名稱。如果沒有提供,Django將使用該EMAIL_HOST_USER
設定的值 。auth_password
:用於驗證SMTP伺服器的可選密碼。如果沒有提供,Django將使用該EMAIL_HOST_PASSWORD
設定的值 。connection
:用於傳送郵件的可選電子郵件後端。如果未指定,將使用預設後端的例項。有關 更多詳細資訊,請參閱電子郵件後端的文件。html_message
:如果html_message
被提供,所得到的電子郵件將是一個 多部分/替代電子郵件message
作為 文字/無格式內容型別和html_message
作為 text / html的內容型別。
返回值將是成功傳遞訊息的數量(可以是0
或1
因為它只能傳送一條訊息)。
5.7.啟用使用者
根據郵箱找到對應的使用者,然後設定is_active = True來實現
# 啟用使用者 class ActiveUserView(View): def get(self, request, active_code): # 查詢郵箱驗證記錄是否存在 all_record = EmailVerifyRecord.objects.filter(code = active_code) if all_record: for record in all_record: # 獲取到對應的郵箱 email = record.email # 查詢到郵箱對應的user user = UserProfile.objects.get(email=email) user.is_active = True user.save() # 驗證碼不對的時候跳轉到啟用失敗頁面 else: return render(request,'active_fail.html') # 啟用成功跳轉到登入頁面 return render(request, "login.html", )
在templates目錄下建立 active_fail.html,程式碼如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p style="color: red;">連結失效</p> </body> </html>
啟用郵箱的郵件如下:
修改login檢視
新增一個判斷,使用者註冊的後,等啟用才能登陸
# users/views.py from django.shortcuts import render from django.contrib.auth import authenticate,login from django.contrib.auth.backends import ModelBackend from .models import UserProfile,EmailVerifyRecord from django.db.models import Q from django.views.generic.base import View from .forms import LoginForm,RegisterForm from django.contrib.auth.hashers import make_password from utils.email_send import send_register_eamil #郵箱和使用者名稱都可以登入 # 基礎ModelBackend類,因為它有authenticate方法 class CustomBackend(ModelBackend): def authenticate(self, request, username=None, password=None, **kwargs): try: # 不希望使用者存在兩個,get只能有一個。兩個是get失敗的一種原因 Q為使用並集查詢 user = UserProfile.objects.get(Q(username=username)|Q(email=username)) # django的後臺中密碼加密:所以不能password==password # UserProfile繼承的AbstractUser中有def check_password(self, raw_password): if user.check_password(password): return user except Exception as e: return None 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', None) pass_word = request.POST.get('password', None) # 成功返回user物件,失敗None user = authenticate(username=user_name, password=pass_word) # 如果不是null說明驗證成功 if user is not None: if user.is_active: # 只有註冊啟用才能登入 login(request, user) return render(request, 'index.html') else: return render(request, 'login.html', {'msg': '使用者名稱或密碼錯誤', 'login_form': login_form}) # 只有當用戶名或密碼不存在時,才返回錯誤資訊到前端 else: return render(request, 'login.html', {'msg': '使用者名稱或密碼錯誤','login_form':login_form}) # form.is_valid()已經判斷不合法了,所以這裡不需要再返回錯誤資訊到前端了 else: return render(request,'login.html',{'login_form':login_form}) # 啟用使用者的view class ActiveUserView(View): def get(self, request, active_code): # 查詢郵箱驗證記錄是否存在 all_record = EmailVerifyRecord.objects.filter(code = active_code) if all_record: for record in all_record: # 獲取到對應的郵箱 email = record.email # 查詢到郵箱對應的user user = UserProfile.objects.get(email=email) user.is_active = True user.save() # 啟用成功跳轉到登入頁面 return render(request, "login.html", ) # 自己瞎輸的驗證碼 else:相關推薦
Django+xadmin打造線上教育平臺(三)
目錄 程式碼 五、使用者註冊 主要實現功能 使用者輸入郵箱、密碼和驗證碼,點註冊按鈕 如果輸入的不正確,提示錯誤資訊 如果正確,傳送啟用郵件,使用者通過郵件啟用後才能登陸 即使註冊成功,沒有啟用的使用者也不能登陸 5.1.初步檢視
Django+xadmin打造線上教育平臺(一)
目錄 程式碼 線上演示 一、前言 開發環境: python: 3.6.4 Django: 2.0.2 後臺管理:xadmin 1.1.專案介紹 系統概括: 系統具有完整的使用者登入註冊以及找回密碼功能,擁有完整個人中心。 個人中心: 修改頭
Django+xadmin打造線上教育平臺(十)
目錄 程式碼 十四、xadmin的進階開發 14.1.許可權管理 (1)使用者許可權 超級使用者擁有所有許可權,其它新增的使用者預設沒有任何許可權 進後臺新增一個使用者“Editor1”,勾上“職員狀態”後,這個使用者才可以登入進後臺,預設沒新增許可權的使用者登入到後臺的情
Django+xadmin打造線上教育平臺(六)
目錄 程式碼 九、課程章節資訊 9.1.模板和urls 拷貝course-comments.html 和 course-video.html放入 templates目錄下 先改course-video.html,同樣繼承base.html,然後裡面有屬於自己的樣式,也要保留
Django+xadmin打造線上教育平臺(八)
目錄 程式碼 十一、使用者資訊 11.1.個人資訊展示 (1)新建‘usercenter-bae.html’當母板 {% load staticfiles %} <!DOCTYPE html> <html> <head&g
Django+xadmin打造線上教育平臺(七)
目錄 程式碼 十、授課教師 10.1.講師列表頁 拷貝teacher-list.html和teacher-detail.html到templates目錄下 先改teacher-list.html,同樣繼承base.html (1)urls配置 organaz
Django+xadmin打造線上教育平臺(九)
目錄 程式碼 十二、首頁和全域性404,500配置 12.1.首頁功能 Course新增一個欄位 is_banner = models.BooleanField('是否輪播',default=False) CourseOrg新增一個欄位 tag = model
Django+xadmin打造線上教育平臺(二)
目錄 程式碼 線上演示 三、xadmin後臺管理 3.1.xadmin的安裝 django2.0的安裝(原始碼安裝方式): https://github.com/sshwsfc/xadmin/tree/django2 把zip檔案放到pip目錄下,執行下面命令安裝
Django+xadmin打造線上教育平臺(五)
目錄 程式碼 八、課程詳情頁功能的實現 8.1.課程列表 (1)配置urls MxOnline/urls中 path("course/", include('course.urls', namespace="course")), course裡面新建urls.p
Django+xadmin打造線上教育平臺(四)
目錄 程式碼 七、授課機構功能 7.1.模板繼承 (1)建立母板 把org-list.html拷貝到templates目錄下,新建base.html,剪下org-list.html內容到裡面 再修改一下靜態檔案的地址(css、就是、image和media) (2)
慕課網學習python+Django+xadmin打造線上教育平臺user app學習總結
學習django這個框架也有一段時間了,一開始接觸到這個框架就對這個框架非常的感興趣,所以就去學習了慕課網上的python升級3.6強力Django+殺手級打造線上教育平臺,目前學習完了六個章節,實現了使用者登入,使用者註冊,找回密碼功能,覺得有必要先總結總結之前的學習,然後
django+xadmin在線教育平臺(四)
app 數據庫名 左右 sqlite3 pyc win data- navi 前置 3-2 配置表單頁面 必要的該說的,該了解的 前置條件: 你已經學習了前面教程。將項目的文件夾目錄結構,setting配置等修改完畢與我保持一致。 本節通過Django快速的配置一個
django+xadmin在線教育平臺(二)
cti .com config Django項目 django 官方下載 不能 ima 相關 老話總是沒錯的,工欲善其事,必先利其器 教你安裝pycharm,mysql,navicat,python相關環境。 windows下搭建開發環境 2-1 pycharm,mys
django+xadmin在線教育平臺(七)
fine 定義 頭像 sta http origin upload ack naconda 4-3 新建項目 Python2.7 創建虛擬環境。 mkvirtualenv mxonline2 安裝django pip install django==1.9.8 註
Django+xadmin打造在線教育平臺(三)
cor 靜態 實現 span xadmin 下載 註冊頁面 用戶名 alt Django+xadmin打造在線教育平臺(三) 代碼 github下載 五、用戶註冊 主要實現功能 用戶輸入郵箱、密碼和驗證碼,點註冊按鈕 如果輸入的不正確,提示錯誤信息 如果正確,發
Python升級3.6 強力Django+殺手級Xadmin打造線上教育平臺 收藏 P
前往下載 第1章 課程介紹 介紹課程目標、通過課程能學習到的內容、和系統開發前需要具備的知識 1-1 專案演示和課程介紹 第2章 windows下搭建開發環境 介紹專案開發需要安裝的開發軟體、 python虛擬virtualenv和 virtualen
Python升級3.6 強力Django+殺手級Xadmin打造線上教育平臺
第1章 課程介紹介紹課程目標、通過課程能學習到的內容、和系統開發前需要具備的知識第2章 windows下搭建開發環境介紹專案開發需要安裝的開發軟體、 python虛擬virtualenv和 virtualenvwrapper的安裝和使用、 最後介紹pycharm和navica
django+xadmin在線教育平臺(十七)
在線 __date__ 書寫 favor 自己 agen cli 相同 ted 8-1 課程列表 拷貝課程列表頁到template目錄 創建課程相關的urls.py Mxonline2/urls.py中聲明包含到course的url中: # 課程app的url配置
(項目)在線教育平臺(三)
har 登錄驗證 mod class true 技術 abs 姓名 ali 五、登錄功能 1、首頁和登錄頁面配置 將首頁的index.html和登錄頁面login.html前端文件拷貝到項目的templates文件夾內,如果需要前端初始文件請聯系我QQ:77906069
(專案)線上教育平臺(五)
七、找回密碼功能 1、找回密碼頁面配置 將找回密碼頁面forgetpwd.html前端檔案拷貝到專案的templates資料夾內。 然後修改註冊頁面register.html初始檔案中的靜態檔案訪問路徑,修改成{% static '靜態檔案路徑' %}的形式。 2、後端找回密碼介面 2.1