Django+Jquery+Ajax+驗(yàn)證碼登錄案例系列之十二

1,創(chuàng)建項(xiàng)目test04

這里寫(xiě)圖片描述

2,創(chuàng)建應(yīng)用app為booktest

這里寫(xiě)圖片描述

3邻吞,注冊(cè)應(yīng)用booktest

作用讓創(chuàng)建的應(yīng)用運(yùn)行起來(lái)

這里寫(xiě)圖片描述

4,在項(xiàng)目根目錄下創(chuàng)建模板templates目錄

  • 作用就是存放html文件
這里寫(xiě)圖片描述
  • 在項(xiàng)目的settings.py文件中配置模板葫男,如下圖:
這里寫(xiě)圖片描述

5抱冷,在項(xiàng)目根目錄下創(chuàng)建static目錄

  • 作用就是存放css/圖片/js等文件
這里寫(xiě)圖片描述
  • 在項(xiàng)目的settings.py文件中配置static文件,如下圖
這里寫(xiě)圖片描述

6梢褐,數(shù)據(jù)庫(kù)的創(chuàng)建與配置

這里寫(xiě)圖片描述

手動(dòng)的在mysql數(shù)據(jù)庫(kù)中創(chuàng)建test04數(shù)據(jù)庫(kù)旺遮,如下圖

這里寫(xiě)圖片描述

7,DEBUG開(kāi)關(guān)設(shè)置

這里寫(xiě)圖片描述

8盈咳,設(shè)置編碼和時(shí)間

LANGUAGE_CODE = 'zh-Hans'

TIME_ZONE = 'Asia/Shanghai'

9耿眉,項(xiàng)目的urls文件中配置如下:

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^',include('booktest.urls'))
]

10,在booktest應(yīng)用下創(chuàng)建urls目錄并配置

from django.conf.urls import url
from  booktest import views

urlpatterns = [
    # 登錄成功url
    url(r'^success/$', views.success),
    # ajax登錄url
    url(r'^login_ajax/$', views.login_ajax),
    # ajax登錄校驗(yàn)url
    url(r'^login_ajax_check/$', views.login_ajax_check),
    # 生產(chǎn)驗(yàn)證碼圖片url
    url(r'^verify_code/$', views.verify_code),
    # 發(fā)帖頁(yè)面url
    url(r'^post_article/$', views.post_article), 
]

11鱼响,在booktest應(yīng)用views中創(chuàng)建各個(gè)視圖函數(shù)

from django.shortcuts import render
from django.http import JsonResponse
# PIL是python2版本的圖像處理庫(kù)鸣剪,不過(guò)現(xiàn)在用Pillow比PIL強(qiáng)大,是python3的處理庫(kù)
from PIL import Image, ImageDraw, ImageFont
from django.http import HttpResponse
from django.shortcuts import render, redirect
import random
# 在python2.x中導(dǎo)入模塊方法:
# from StringIO import String
# 在python2.x中它還有個(gè)孿生兄弟丈积,運(yùn)行速度比它快筐骇,用c實(shí)現(xiàn)的
# from cStringIO import StringIO

# 在python3.x中,StringIO已經(jīng)在io模塊中了江滨,導(dǎo)入方法
from io import BytesIO


# ajax登錄視圖函數(shù)
def login_ajax(request):
    return render(request, 'booktest/login_ajax.html')


# ajax登錄校驗(yàn)回調(diào)視圖函數(shù)
def login_ajax_check(request):
    # 1铛纬,獲取用戶輸入的用戶名和密碼
    uname = request.POST.get('uname')
    password = request.POST.get('password')
    # 獲取用戶輸入的驗(yàn)證碼
    vcode = request.POST.get('vcode')
    # 獲取session中的驗(yàn)證碼
    vcode_session = request.session.get('verifycode')

    # 2,用戶名和密碼校驗(yàn)
    if uname == 'xiaoke' and password == '123456' and vcode == vcode_session:
        # 保存用戶的登錄狀態(tài)
        request.session['isLogin']=True
        request.session['uname']=uname
        request.session['password']=password
        return JsonResponse({'msg': 'ok'})
    elif uname != 'xiaoke' or password != '123456':
        return JsonResponse({'msg': 'fail_user'})
    elif vcode != vcode_session:
        return JsonResponse({'msg': 'fail_verify'})


def verify_code(request):
    # 1,定義變量唬滑,用于畫(huà)面的背景色告唆、寬莫秆、高
    # random.randrange(20, 100)意思是在20到100之間隨機(jī)找一個(gè)數(shù)
    bgcolor = (random.randrange(20, 100), random.randrange(20, 100), 255)
    width = 100
    height = 25
    # 2,創(chuàng)建畫(huà)面對(duì)象
    im = Image.new('RGB', (width, height), bgcolor)
    # 3悔详,創(chuàng)建畫(huà)筆對(duì)象
    draw = ImageDraw.Draw(im)
    # 4镊屎,調(diào)用畫(huà)筆的point()函數(shù)繪制噪點(diǎn),防止攻擊
    for i in range(0, 100):
        # 噪點(diǎn)繪制的范圍
        xy = (random.randrange(0, width), random.randrange(0, height))
        # 噪點(diǎn)的隨機(jī)顏色
        fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
        # 繪制出噪點(diǎn)
        draw.point(xy, fill=fill)
    # 5茄螃,定義驗(yàn)證碼的備選值
    str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0'
    # 6缝驳,隨機(jī)選取4個(gè)值作為驗(yàn)證碼
    rand_str = ''
    for i in range(0, 4):
        rand_str += str1[random.randrange(0, len(str1))]
    # 7,構(gòu)造字體對(duì)象归苍,ubuntu的字體路徑為“/usr/share/fonts/truetype/freefont”
    font = ImageFont.truetype('FreeMono.ttf', 23)
    # 8用狱,構(gòu)造字體顏色
    fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))
    # 9,繪制4個(gè)字
    draw.text((5, 2), rand_str[0], font=font, fill=fontcolor)
    draw.text((25, 2), rand_str[1], font=font, fill=fontcolor)
    draw.text((50, 2), rand_str[2], font=font, fill=fontcolor)
    draw.text((75, 2), rand_str[3], font=font, fill=fontcolor)
    # 9拼弃,用完畫(huà)筆夏伊,釋放畫(huà)筆
    del draw
    # 10,存入session吻氧,用于做進(jìn)一步驗(yàn)證
    request.session['verifycode'] = rand_str
    # 11溺忧,內(nèi)存文件操作
    buf = BytesIO()
    # 12,將圖片保存在內(nèi)存中盯孙,文件類型為png
    im.save(buf, 'png')
    # 13鲁森,將內(nèi)存中的圖片數(shù)據(jù)返回給客戶端,MIME類型為圖片png
    return HttpResponse(buf.getvalue(), 'image/png')


# ajax登錄成功視圖函數(shù)
def success(request):
    # 用戶已經(jīng)登錄
    if request.session.get('isLogin'):
        return render(request, 'booktest/success.html')
    else:
        return redirect('/login_ajax/')

# 發(fā)帖操作視圖函數(shù)
def post_article(request):
    # 獲取登錄的用戶名
    uname = request.session.get('uname')
    # 獲取帖子的標(biāo)題
    title = request.POST.get('title')
    content = request.POST.get('content')
    return HttpResponse('%s發(fā)了一篇名為%s的帖子:%s' % (uname.encode('utf-8').decode('utf-8'),
                        title.encode('utf-8').decode('utf-8'),content.encode('utf-8').decode('utf-8')))

12振惰,ajax登錄頁(yè)面布局代碼如下:

  • csrf_token 的目地是為了防止csrf公積歌溉,django默認(rèn)打開(kāi)csrf:如下代碼
  • 'django.middleware.csrf.CsrfViewMiddleware',
  • 查看網(wǎng)頁(yè)源代碼可知,csrf的鍵和值骑晶,所以請(qǐng)求的時(shí)候要攜帶痛垛,否則django直接禁止:
這里寫(xiě)圖片描述
  • ajax登錄頁(yè)面具體布局如下:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登錄頁(yè)面</title>
    <script src="/static/js/jquery-1.12.4.min.js"></script>
    <style>
        #errorMsg {
            display: none;
            color: red;
        }
    </style>
    <script>
        $(function () {

            $('#btnLogin').click(function () {
                $('uname').reset;

                csrf = $('input').val();
                uname = $('#uname').val();
                password = $('#password').val();
                vcode = $('#vcode').val();

                //發(fā)起ajax請(qǐng)求,注意csrf攻擊
                $.post('/login_ajax_check/', {
                    'csrfmiddlewaretoken': csrf,
                    'uname': uname,
                    'password': password,
                    'vcode': vcode,
                }, function (data) {
                    //獲取返回的數(shù)據(jù)并進(jìn)行操作
                    if (data.msg === 'ok') {
                        //登錄成功
                        location.href = '/success/' //跳轉(zhuǎn)到成功頁(yè)面
                    } else if (data.msg === 'fail_user') {
                        $('#errorMsg').show().text('親桶蛔!用戶名或密碼錯(cuò)誤匙头!')

                    } else if (data.msg === 'fail_verify') {
                        //驗(yàn)證碼錯(cuò)誤
                        $('#errorMsg').show().text('親!驗(yàn)證碼錯(cuò)誤羽圃!')
                    }
                })
            });
        });

    </script>
</head>

<body>

<div>
    {% csrf_token %}
    用戶名:<input type="text" id="uname"><br/>
    密  碼:<input type="password" id="password"><br/>

    驗(yàn)證碼:<input type="text" id="vcode"/><br/>
    <!--直接調(diào)用生產(chǎn)圖片驗(yàn)證碼的視圖函數(shù)乾胶,生產(chǎn)驗(yàn)證碼-->
    ![](/verify_code/)<br/>

    <input type="button" value="登錄" id="btnLogin"><br/>
    <div id="errorMsg"></div>
</div>

</body>
</html>

13,登錄成功頁(yè)面朽寞,進(jìn)行發(fā)帖布局代碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登錄成功,發(fā)帖頁(yè)面</title>
</head>
<body>

<h2>親斩郎!你登錄成功了脑融,歡迎你!K跻恕肘迎!</h2>
<form method="post" action="/post_article/">
    {% csrf_token %}
    標(biāo)題:<input type="text" name="title"/><br/>
    內(nèi)容:<textarea name="content"></textarea><br/>
    <input type="submit" value="發(fā)帖"/>
</form>
</body>
</html>

14甥温,執(zhí)行遷移,生成session表

  • session表示需要執(zhí)行遷移后妓布,才會(huì)在mysql數(shù)據(jù)庫(kù)中生成
這里寫(xiě)圖片描述

15姻蚓,查看mysql數(shù)據(jù)庫(kù)

  • show tables;查看數(shù)據(jù)庫(kù)test04中的表
  • django_session就是session表
這里寫(xiě)圖片描述
這里寫(xiě)圖片描述
  • desc django_session;查看session表結(jié)構(gòu):
  • 有session的鍵、值和過(guò)期時(shí)間
這里寫(xiě)圖片描述

16匣沼,開(kāi)始登錄測(cè)試

  • 輸入用戶名狰挡、密碼和驗(yàn)證碼
這里寫(xiě)圖片描述
  • 這是登錄成功后的頁(yè)面,進(jìn)行發(fā)帖
這里寫(xiě)圖片描述
  • 這是發(fā)帖頁(yè)面
這里寫(xiě)圖片描述

17释涛,查看數(shù)據(jù)庫(kù)中session表

這里寫(xiě)圖片描述

查看Cookie中的sessionid值為“hzlqkmdkn6461kfwfm2oj7p5889o2fo1”加叁,數(shù)據(jù)表中session的鍵為“hzlqkmdkn6461kfwfm2oj7p5889o2fo1”,是一樣的唇撬,這樣它匕,服務(wù)器就可以在眾多的請(qǐng)求者中找到對(duì)應(yīng)的Session數(shù)據(jù)。

這里寫(xiě)圖片描述

在MySQL數(shù)據(jù)庫(kù)命令行中復(fù)制值窖认,在Base64解碼中進(jìn)行解碼查看如下圖豫柬。

這里寫(xiě)圖片描述

18,代碼github地址如下:

https://github.com/ITXIAOKE/pythonLoginProject

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扑浸,一起剝皮案震驚了整個(gè)濱河市轮傍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌首装,老刑警劉巖创夜,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異仙逻,居然都是意外死亡驰吓,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)系奉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)檬贰,“玉大人,你說(shuō)我怎么就攤上這事缺亮∥痰樱” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵萌踱,是天一觀的道長(zhǎng)葵礼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)并鸵,這世上最難降的妖魔是什么鸳粉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮园担,結(jié)果婚禮上届谈,老公的妹妹穿的比我還像新娘枯夜。我一直安慰自己,他們只是感情好艰山,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布湖雹。 她就那樣靜靜地躺著,像睡著了一般曙搬。 火紅的嫁衣襯著肌膚如雪摔吏。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,549評(píng)論 1 312
  • 那天织鲸,我揣著相機(jī)與錄音舔腾,去河邊找鬼。 笑死搂擦,一個(gè)胖子當(dāng)著我的面吹牛稳诚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瀑踢,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼扳还,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了橱夭?” 一聲冷哼從身側(cè)響起氨距,我...
    開(kāi)封第一講書(shū)人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棘劣,沒(méi)想到半個(gè)月后俏让,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茬暇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年首昔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糙俗。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡勒奇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出巧骚,到底是詐尸還是另有隱情赊颠,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布劈彪,位于F島的核電站竣蹦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏粉臊。R本人自食惡果不足惜草添,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扼仲。 院中可真熱鬧远寸,春花似錦、人聲如沸屠凶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)矗愧。三九已至灶芝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唉韭,已是汗流浹背夜涕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留属愤,地道東北人女器。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像住诸,于是被迫代替她去往敵國(guó)和親驾胆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

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