1. 程式人生 > >Django+Jquery+Ajax+驗證碼登入案例

Django+Jquery+Ajax+驗證碼登入案例

1,建立專案test04

這裡寫圖片描述

2,建立應用app為booktest

這裡寫圖片描述

3,註冊應用booktest

作用讓建立的應用執行起來

4,在專案根目錄下建立模板templates目錄

  • 作用就是存放html檔案

這裡寫圖片描述

  • 在專案的settings.py檔案中配置模板,如下圖:

這裡寫圖片描述

 

5,在專案根目錄下建立static目錄

  • 作用就是存放css/圖片/js等檔案

這裡寫圖片描述

  • 在專案的settings.py檔案中配置static檔案,如下圖

這裡寫圖片描述

6,資料庫的建立與配置

這裡寫圖片描述

手動的在mysql資料庫中建立test04資料庫,如下圖

這裡寫圖片描述

7,DEBUG開關設定

這裡寫圖片描述

8,設定編碼和時間

LANGUAGE_CODE = 'zh-Hans'

TIME_ZONE = 'Asia/Shanghai'

9,專案的urls檔案中配置如下:

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

10,在booktest應用下建立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登入校驗url
    url(r'^login_ajax_check/$', views.login_ajax_check),
    # 生產驗證碼圖片url
    url(r'^verify_code/$', views.verify_code),
    # 發帖頁面url
    url(r'^post_article/$', views.post_article), 
]
--------------------- 
作者:ITxiaoke 
來源:CSDN 
原文:https://blog.csdn.net/u014745194/article/details/73997737?utm_source=copy 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

11,在booktest應用views中建立各個檢視函式

from django.shortcuts import render
from django.http import JsonResponse
# PIL是python2版本的影象處理庫,不過現在用Pillow比PIL強大,是python3的處理庫
from PIL import Image, ImageDraw, ImageFont
from django.http import HttpResponse
from django.shortcuts import render, redirect
import random
# 在python2.x中匯入模組方法:
# from StringIO import String
# 在python2.x中它還有個孿生兄弟,執行速度比它快,用c實現的
# from cStringIO import StringIO

# 在python3.x中,StringIO已經在io模組中了,匯入方法
from io import BytesIO


# ajax登入檢視函式
def login_ajax(request):
    return render(request, 'booktest/login_ajax.html')


# ajax登入校驗回撥檢視函式
def login_ajax_check(request):
    # 1,獲取使用者輸入的使用者名稱和密碼
    uname = request.POST.get('uname')
    password = request.POST.get('password')
    # 獲取使用者輸入的驗證碼
    vcode = request.POST.get('vcode')
    # 獲取session中的驗證碼
    vcode_session = request.session.get('verifycode')

    # 2,使用者名稱和密碼校驗
    if uname == 'xiaoke' and password == '123456' and vcode == vcode_session:
        # 儲存使用者的登入狀態
        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,定義變數,用於畫面的背景色、寬、高
    # random.randrange(20, 100)意思是在20到100之間隨機找一個數
    bgcolor = (random.randrange(20, 100), random.randrange(20, 100), 255)
    width = 100
    height = 25
    # 2,建立畫面物件
    im = Image.new('RGB', (width, height), bgcolor)
    # 3,建立畫筆物件
    draw = ImageDraw.Draw(im)
    # 4,呼叫畫筆的point()函式繪製噪點,防止攻擊
    for i in range(0, 100):
        # 噪點繪製的範圍
        xy = (random.randrange(0, width), random.randrange(0, height))
        # 噪點的隨機顏色
        fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
        # 繪製出噪點
        draw.point(xy, fill=fill)
    # 5,定義驗證碼的備選值
    str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0'
    # 6,隨機選取4個值作為驗證碼
    rand_str = ''
    for i in range(0, 4):
        rand_str += str1[random.randrange(0, len(str1))]
    # 7,構造字型物件,ubuntu的字型路徑為“/usr/share/fonts/truetype/freefont”
    font = ImageFont.truetype('FreeMono.ttf', 23)
    # 8,構造字型顏色
    fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))
    # 9,繪製4個字
    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,用完畫筆,釋放畫筆
    del draw
    # 10,存入session,用於做進一步驗證
    request.session['verifycode'] = rand_str
    # 11,記憶體檔案操作
    buf = BytesIO()
    # 12,將圖片儲存在記憶體中,檔案型別為png
    im.save(buf, 'png')
    # 13,將記憶體中的圖片資料返回給客戶端,MIME型別為圖片png
    return HttpResponse(buf.getvalue(), 'image/png')


# ajax登入成功檢視函式
def success(request):
    # 使用者已經登入
    if request.session.get('isLogin'):
        return render(request, 'booktest/success.html')
    else:
        return redirect('/login_ajax/')

# 發帖操作檢視函式
def post_article(request):
    # 獲取登入的使用者名稱
    uname = request.session.get('uname')
    # 獲取帖子的標題
    title = request.POST.get('title')
    content = request.POST.get('content')
    return HttpResponse('%s發了一篇名為%s的帖子:%s' % (uname.encode('utf-8').decode('utf-8'),
                        title.encode('utf-8').decode('utf-8'),content.encode('utf-8').decode('utf-8')))
--------------------- 
作者:ITxiaoke 
來源:CSDN 
原文:https://blog.csdn.net/u014745194/article/details/73997737?utm_source=copy 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

12,ajax登入頁面佈局程式碼如下:

以下是csrf攻擊的原理圖:

這裡寫圖片描述

csrf_token 的目地是為了防止csrf公積,django預設開啟csrf:如下程式碼
‘django.middleware.csrf.CsrfViewMiddleware’,
檢視網頁原始碼可知,csrf的鍵和值,所以請求的時候要攜帶,否則django直接禁止:
這裡寫圖片描述

 ajax登入頁面具體佈局如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登入頁面</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();

                //發起ajax請求,注意csrf攻擊
                $.post('/login_ajax_check/', {
                    'csrfmiddlewaretoken': csrf,
                    'uname': uname,
                    'password': password,
                    'vcode': vcode,
                }, function (data) {
                    //獲取返回的資料並進行操作
                    if (data.msg === 'ok') {
                        //登入成功
                        location.href = '/success/' //跳轉到成功頁面
                    } else if (data.msg === 'fail_user') {
                        $('#errorMsg').show().text('親!使用者名稱或密碼錯誤!')

                    } else if (data.msg === 'fail_verify') {
                        //驗證碼錯誤
                        $('#errorMsg').show().text('親!驗證碼錯誤!')
                    }
                })
            });
        });

    </script>
</head>

<body>

<div>
    {% csrf_token %}
    使用者名稱:<input type="text" id="uname"><br/>
    密&nbsp;&nbsp;碼:<input type="password" id="password"><br/>

    驗證碼:<input type="text" id="vcode"/><br/>
    <!--直接呼叫生產圖片驗證碼的檢視函式,生產驗證碼-->
    <img src="/verify_code/" id="imgvcode"/><br/>

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

</body>
</html>
--------------------- 
作者:ITxiaoke 
來源:CSDN 
原文:https://blog.csdn.net/u014745194/article/details/73997737?utm_source=copy 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

13,登入成功頁面,進行發帖佈局程式碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登入成功,發帖頁面</title>
</head>
<body>

<h2>親!你登入成功了,歡迎你!!!</h2>
<form method="post" action="/post_article/">
    {% csrf_token %}
    標題:<input type="text" name="title"/><br/>
    內容:<textarea name="content"></textarea><br/>
    <input type="submit" value="發帖"/>
</form>
</body>
</html>
--------------------- 
作者:ITxiaoke 
來源:CSDN 
原文:https://blog.csdn.net/u014745194/article/details/73997737?utm_source=copy 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

14,執行遷移,生成session表

 

  • session表示需要執行遷移後,才會在mysql資料庫中生成
  • 這裡寫圖片描述

15,檢視mysql資料庫

 這裡寫圖片描述

 

  • show tables;檢視資料庫test04中的表
  • django_session就是session表
  • 這裡寫圖片描述

16,開始登入測試

這是登入成功後的頁面,進行發帖

這裡寫圖片描述 

這是發帖頁面

這裡寫圖片描述 

 

  • 輸入使用者名稱、密碼和驗證碼
  • 這裡寫圖片描述

17,檢視資料庫中session表

這裡寫圖片描述 檢視Cookie中的sessionid值為“hzlqkmdkn6461kfwfm2oj7p5889o2fo1”,資料表中session的鍵為“hzlqkmdkn6461kfwfm2oj7p5889o2fo1”,是一樣的,這樣,伺服器就可以在眾多的請求者中找到對應的Session資料。
這裡寫圖片描述

轉載自https://blog.csdn.net/u014745194/article/details/73997737