1. 程式人生 > >Django+xadmin打造線上教育平臺(三)

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>&nbsp;&nbsp;</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()

subjectmessagefrom_emailrecipient_list引數是必需的。

  • subject:一個字串。
  • message:一個字串。
  • from_email:一個字串。
  • recipient_list:字串列表,每個字串都是電子郵件地址。每個成員都recipient_list將在電子郵件的“收件人:”欄位中看到其他收件人。
  • fail_silently:一個布林值。如果是的話Falsesend_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的內容型別。

返回值將是成功傳遞訊息的數量(可以是01因為它只能傳送一條訊息)。

 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