強(qiáng)力Django第六章9-10郵箱注冊(cè)驗(yàn)證和激活

step:1創(chuàng)建驗(yàn)證時(shí)發(fā)送郵件的app
在apps目錄下創(chuàng)建utils文件夾,并創(chuàng)建文件email_send.py


圖片.png

setp:2編輯email_send.py

# _*_ encoding:utf-8 _*_
__author__ = 'luky'
__date__ = '2018/5/2 9:54'

from random import Random
# 導(dǎo)入django內(nèi)置的send_mail函數(shù),發(fā)送郵件
from django.core.mail import send_mail
# 調(diào)用users中models.py定義的EmailVerifyRecord函數(shù)
from users.models import EmailVerifyRecord

# 導(dǎo)入settings定義的郵件服務(wù)器
from mxonline.settings import EMAIL_FROM

# 隨機(jī)生成字符串的函數(shù)
def random_str(randomlength=8):
    str = '' #定義空串
    chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'#定義隨機(jī)可選的字符串
    length = len(chars) - 1 #
    random = Random() #調(diào)用Random方法 隨機(jī)生成數(shù)字
    #根據(jù)生成的數(shù)字 到chars中去取對(duì)應(yīng)的字符串,然后加在一起。
    for i in range(randomlength):
        str+=chars[random.randint(0, length)]
    return str


# 創(chuàng)建郵箱認(rèn)證的方法灰蛙,調(diào)用EmailVerifyRecord函數(shù)中的字段和隨機(jī)生成的字符串保存到數(shù)據(jù)庫中,用于驗(yàn)證時(shí)的匹配
def send_register_email(email, send_type="register"):#send_type不能為0
    email_record = EmailVerifyRecord()
    code = random_str(16)
    email_record.code = code
    email_record.email = email
    email_record.send_type = send_type
    email_record.save()

    # 定義好郵件的內(nèi)容
    email_title = ""
    email_body = ""

    # 通過判斷send_type的值,來發(fā)送不通的郵件內(nèi)容巧还。
    if send_type == "register":
        email_title = "慕學(xué)在線網(wǎng)注冊(cè)激活鏈接"
        email_body = "請(qǐng)點(diǎn)擊下面的鏈接激活你的賬號(hào): 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



setp:3 在settings中設(shè)置郵件服務(wù)器的信息,在最下面添加相關(guān)配置
編輯 settings.py

# EMAIL_FROM 與EMAIL_HOST_USER要保持一致
EMAIL_HOST = "smtp.163.com"
EMAIL_PORT = 25
EMAIL_HOST_USER = "username@163.com"
EMAIL_HOST_PASSWORD = "password"
EMAIL_USE_TLS = False
EMAIL_FROM = "username@163.com"

setp:4在views增加發(fā)送郵件的調(diào)用
在上面增加函數(shù)的調(diào)用

#調(diào)用郵件驗(yàn)證的函數(shù)
from utils.email_send import send_register_email

修改ResgisterView類中的post方法,增加郵件發(fā)送的動(dòng)作

    def post(self, request):
        register_form = RegisterForm(request.POST)
        if register_form.is_valid():
            user_name = request.POST.get("email", "")
            pass_word = request.POST.get("password", "")
            user_profile = UserProfile()
            user_profile.username = user_name
            user_profile.email = user_name
            user_profile.password = make_password(pass_word)
            user_profile.save()

            send_register_email(user_name, "register")
            return render(request, "login.html")
        else:
            return render(request, "register.html")

setp5:郵箱注冊(cè)功能驗(yàn)證
設(shè)置斷點(diǎn)坊秸,debug啟動(dòng)


圖片.png

登陸注冊(cè)頁面輸入正確的信息


圖片.png

然后查看pycharm 按F8 斷點(diǎn)調(diào)試麸祷,可以通過截圖看到驗(yàn)證通過
圖片.png

查看數(shù)據(jù)庫users_userprofile表,新創(chuàng)建的用戶已入庫
圖片.png

登陸郵箱查看褒搔,已收到激活鏈接的郵件~~~


圖片.png

step6:完善views 增加錯(cuò)誤輸出
修改views/py阶牍,在修改ResgisterView類中的post方法增加 else部分

        else:
            return render(request, "register.html", {"register_form":register_form})

修改register.html中的用戶輸入部分,增加錯(cuò)誤輸出代碼和輸入回填功能星瘾。

                <div class="tab-form">
                    <form id="email_register_form" method="post" action="{% url 'resgister' %}" autocomplete="off">
                        <input type='hidden' name='csrfmiddlewaretoken' value='gTZljXgnpvxn0fKZ1XkWrM1PrCGSjiCZ' />
                        <!-- {% if register_form.errors.email %}errorput{% endif %}"將用戶輸入的錯(cuò)誤信息顯示出來 -->
                        <div class="form-group marb20 {% if register_form.errors.email %}errorput{% endif %}">
                            <label>郵&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;箱</label>
                            <!-- value="{{ register_form.email.value }}將用戶上一次輸入的內(nèi)容回填進(jìn)去 -->
                            <input  type="text" id="id_email" name="email" value="{{ register_form.email.value }}"  placeholder="請(qǐng)輸入您的郵箱地址" />
                        </div>
                        <!-- {% if register_form.errors.password %}errorput{% endif %}"將用戶輸入的密碼錯(cuò)誤信息顯示出來 -->
                        <div class="form-group marb8 {% if register_form.errors.password %}errorput{% endif %}">
                            <label>密&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;碼</label>
                            <input type="password" id="id_password" name="password" value="{{ register_form.password.value }}" placeholder="請(qǐng)輸入6-20位非中文字符密碼" />
                        </div>
                        <div class="form-group marb8 captcha1 {% if register_form.errors.captcha %}errorput{% endif %}">
                            <label>驗(yàn)&nbsp;證&nbsp;碼</label>
                            {{ register_form.captcha }}
                        </div>
                        <div class="error btns" id="jsEmailTips">{% for key,error in register_form.errors.items %}{{ error }}{% endfor %}{{ msg }}</div>
                        <div class="auto-box marb8">
                        </div>
                        <input class="btn btn-green" id="jsEmailRegBtn" type="submit" value="注冊(cè)并登錄" />
                    {% csrf_token %}
                    </form>

驗(yàn)證如下:


image.png

step7:郵箱激活
修改 view.py,ResgisterView類中的post方法走孽,增加user_profile.is_active = False

        if register_form.is_valid():
            user_name = request.POST.get("email", "")
            pass_word = request.POST.get("password", "")
            user_profile = UserProfile()
            user_profile.username = user_name
            user_profile.email = user_name
            # user_profile.is_active = False表明用戶未激活
            user_profile.is_active = False
            user_profile.password = make_password(pass_word)
            user_profile.save()

修改urls.py,增加激活碼訪問的格式active/,定義匹配active_code的字符串

from django.conf.urls import url, include
# from django.contrib import admin
from django.views.generic import TemplateView
import xadmin

from users.views import LoginView, ResgisterView,ActiveUserView

urlpatterns = [
    url(r'^xadmin/', xadmin.site.urls),
    url('^$', TemplateView.as_view(template_name="index.html"), name="index"),
    url('^login/$', LoginView.as_view(), name="login"),
    url('^register/$', ResgisterView.as_view(), name="resgister"),
    url(r'^captcha/', include('captcha.urls')),
    url(r'^active/(?P<active_code>.*)/$', ActiveUserView.as_view(), name="user_active"),

修改view.py琳状,新增ActiveUserView類

class ActiveUserView(View):
    def get(self, request, active_code):
        pass

驗(yàn)證激活碼能否獲得到
先設(shè)置斷點(diǎn)


image.png

再到郵箱查看收到的驗(yàn)證郵件


image.png

訪問郵件中的地址融求,然后查看pycharm中的debug信息,可以匹配到active_code與郵件中的字符串一致算撮。
image.png

我們已經(jīng)能夠獲取active_code了生宛,接下來修改views.py增加邏輯,查詢匹配驗(yàn)證記錄是否存在和用戶是否激活以及相應(yīng)的觸發(fā)動(dòng)作肮柜。

增加 EmailVerifyRecord的調(diào)用

from .models import UserProfile, EmailVerifyRecord

修改ActiveUserView類陷舅,判斷用戶的驗(yàn)證碼記錄,并根據(jù)結(jié)果修改數(shù)據(jù)庫的值审洞。

class ActiveUserView(View):
    def get(self, request, active_code):
        # 查詢郵件中的驗(yàn)證碼與code是否一致
        all_records = EmailVerifyRecord.objects.filter(code=active_code)
        if all_records:
            for record in all_records:
                email = record.email
                user = UserProfile.objects.get(email=email)
                user.is_active = True
                user.save()
        return render(request, "login.html")

修改LoginView類的post函數(shù)莱睁,增加用戶是否激活的判斷待讳。

class LoginView(View):
    def get(self, request):
        return render(request, "login.html", {})

    def post(self, request):
        # 增加form組件對(duì)用戶提交的表單進(jìn)行預(yù)處理,驗(yàn)證參數(shù)是否正確
        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:
                #驗(yàn)證用戶是否激活
                if user.is_active:
                    login(request, user)
                    return render(request, "index.html")
                else:
                    return render(request, "login.html", {"msg": "用戶未激活仰剿!"})
            else:
                # 2{"msg":"用戶名密碼輸入錯(cuò)誤创淡!"}定義數(shù)據(jù)庫查詢后驗(yàn)證的報(bào)錯(cuò)輸。在login.html代碼中加入
                return render(request, "login.html", {"msg": "用戶名密碼輸入錯(cuò)誤南吮!"})
        else:
            # 3{"login_form":login_form}定義form驗(yàn)證報(bào)錯(cuò)輸琳彩。在login.html代碼中加入
            return render(request, "login.html", {"login_form":login_form})

此時(shí)查看數(shù)據(jù)庫users_userprofile表中的is_active字段,查看kn_0933用戶的值為0部凑,表示未激活露乏。


image.png

那么測(cè)試用上述的郵箱登陸,結(jié)果顯示用戶未激活涂邀。


image.png

然后我們?cè)L問一下郵件中驗(yàn)證的地址:http://127.0.0.1:8000/active/HEcXTVNYSkzKQWTC
此時(shí)可以看到數(shù)據(jù)庫中的字段值已經(jīng)變?yōu)?瘟仿,表示已激活狀態(tài)。

image.png

最后我們用郵箱登陸比勉,一切OK~
image.png

#######################補(bǔ)充########################

增加注冊(cè)時(shí)判斷用戶是否存在劳较,以及激活驗(yàn)證失敗的動(dòng)作

step1:修改views.py,ResgisterView類的post方法,增加如下代碼
if UserProfile.objects.filter(email=user_name):
return render(request, "register.html", {"register_form":register_form, "msg":"用戶已存在"})

    def post(self, request):
        register_form = RegisterForm(request.POST)
        if register_form.is_valid():
            user_name = request.POST.get("email", "")
            # 判斷用戶的EMAIL是否已存在
            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
            # user_profile.is_active = False表明用戶未激活
            user_profile.is_active = False
            user_profile.password = make_password(pass_word)
            user_profile.save()

            send_register_email(user_name, "register")
            return render(request, "login.html")
        else:
            # {"register_form":register_form}定義form驗(yàn)證報(bào)錯(cuò)輸浩聋。在register.html代碼中加入
            return render(request, "register.html", {"register_form":register_form})

驗(yàn)證:登陸已注冊(cè)好的用戶兴想。


image.png

step2:發(fā)送激活鏈接時(shí),檢測(cè)用戶不存在后的動(dòng)作赡勘,增加鏈接失效頁面
在template中新建鏈接失效頁面active_fail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<p>鏈接失效<p>
</body>
</html>

修改views.py嫂便,ActiveUserView類增加如下代碼
else:
return render(request, "avtive_fail.html")

class ActiveUserView(View):
    def get(self, request, active_code):
        # 查詢郵件中的驗(yàn)證碼與code是否一致
        all_records = EmailVerifyRecord.objects.filter(code=active_code)
        if all_records:
            for record in all_records:
                email = record.email
                user = UserProfile.objects.get(email=email)
                user.is_active = True
                user.save()
        else:
            return render(request, "avtive_fail.html")
        return render(request, "login.html")

驗(yàn)證:打開瀏覽器 輸入http://127.0.0.1:8000/active/隨機(jī)輸入一些字符串

image.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市闸与,隨后出現(xiàn)的幾起案子毙替,更是在濱河造成了極大的恐慌,老刑警劉巖践樱,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厂画,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拷邢,警方通過查閱死者的電腦和手機(jī)袱院,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞭稼,“玉大人忽洛,你說我怎么就攤上這事』分猓” “怎么了欲虚?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長悔雹。 經(jīng)常有香客問我复哆,道長欣喧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任梯找,我火速辦了婚禮唆阿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锈锤。我一直安慰自己驯鳖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布牙咏。 她就那樣靜靜地躺著,像睡著了一般嘹裂。 火紅的嫁衣襯著肌膚如雪妄壶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天寄狼,我揣著相機(jī)與錄音丁寄,去河邊找鬼。 笑死泊愧,一個(gè)胖子當(dāng)著我的面吹牛伊磺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播删咱,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼屑埋,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了痰滋?” 一聲冷哼從身側(cè)響起摘能,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎敲街,沒想到半個(gè)月后团搞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡多艇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年逻恐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片峻黍。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡复隆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出姆涩,到底是詐尸還是另有隱情昏名,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布阵面,位于F島的核電站轻局,受9級(jí)特大地震影響洪鸭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仑扑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一览爵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧镇饮,春花似錦蜓竹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钙勃,卻和暖如春蛛碌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辖源。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工蔚携, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人克饶。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓酝蜒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親矾湃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子亡脑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)邀跃,斷路器远豺,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • 在上一個(gè)章節(jié),我們已經(jīng)創(chuàng)建了一個(gè)基礎(chǔ)的Blog程序∥豚郑現(xiàn)在我們將使用一些Dajngo高級(jí)功能躯护,去實(shí)現(xiàn)一個(gè)完整的blo...
    金金剛狼閱讀 3,586評(píng)論 1 12
  • 《暨參加六六老師工作坊》2018-02-04 周日 今天去參加六六老師的工作坊,感謝雯雯騎車帶我一同前去丽涩! 六六老...
    匆匆_blue閱讀 372評(píng)論 1 8
  • 午后矢渊,正迷迷糊糊地躺在沙發(fā)上继准,手機(jī)微信一連響了好幾聲。打開一看矮男。心中立刻溫暖如春移必。 “ 看到你發(fā)的文章了,...
    21雪絨花閱讀 648評(píng)論 0 0
  • 根據(jù)上周的實(shí)際情況毡鉴,工作加照顧小孩崔泵,原設(shè)計(jì)的投資計(jì)劃主題實(shí)際難以實(shí)現(xiàn)秒赤。主題一利用上班空余時(shí)間看書學(xué)習(xí)內(nèi)部審計(jì),時(shí)間...
    請(qǐng)叫我靜靜閱讀 290評(píng)論 0 0