Django中生成隨機驗證碼
1、html中a標簽的設置
1 <img src="/get_validcode_img/" alt="">
2、views中的get2、views中的getvalidcode_img設置
導入文件
1 import json 2 import os 3 import random 4 from django.contrib import auth 5 from django.shortcuts import render, redirect, HttpResponse 6 from django.forms import Form 7 from django.forms import fields 8 from django.forms import widgets 9 from django.core.exceptions import ValidationError 10 from django.conf import settings 11 from PIL import Image, ImageDraw, ImageFont 12 from io import BytesIO
方法配置
1 def get_validcode_img(request): 2 color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) 3 # 生成一個顏色隨機的大小為160,30的圖片 4 img = Image.new(mode="RGB", size=(160, 30), color=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))) 5 # 設置圖片的繪制顏色 6 draw = ImageDraw.Draw(img, "RGB") 7 # 設置圖片的繪制字體(只寫字體名,會默認在系統的Fonts下去找) 8 # font_path = os.path.join(settings.BASE_DIR, "static", "font", "kumo.ttf") 9 # font = ImageFont.truetype(font_path, 25) 10 font = ImageFont.truetype(r'C:\Windows\Fonts\Arial.ttf', 25) 11 # font = ImageFont.truetype(r'C:\中文\kumo.ttf', 25) # 中文路徑無法識別 12 13 # 設置圖片上的字符串 14 valid_list = [] 15 for i in range(5): 16 random_num = str(random.randint(0, 9)) 17 random_letter_low = chr(random.randint(65, 90)) 18 random_letter_upper = chr(random.randint(96, 122)) 19 random_char = random.choice([random_num, random_letter_low, random_letter_upper]) # 隨機選擇字符(數字,大小寫字母) 20 # 通過draw.text方法,設置圖片上字符串的x,y坐標,字符串,顏色,字體(for循環5次,生成5個字符的驗證碼) 21 draw.text([5+i*25, 10], random_char, (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)), font=font) 22 valid_list.append(random_char) 23 # 獲取一個內存中的文件句柄 24 f = BytesIO() 25 # 在文件句柄中寫入文件 26 img.save(f, 'png') 27 # 取出文件 28 data = f.getvalue() 29 # 轉換成字符串 30 valid_str = "".join(valid_list) 31 print(valid_str) 32 33 # 把驗證碼保存在session中,當用戶出入驗證碼發送請求的時候,把用戶輸入的數據和session中的驗證碼做對比 34 request.session["validcode"] = valid_str 35 return HttpResponse(data)
三、 Ajax請求配置
1 $(function(){ 2 $("#login_btn").click(function () { 3 var username = $("#username").val(); 4 var password = $("#password").val(); 5 var validcode = $("#validcode").val(); 6 7 $.ajax({ 8 url: "/login/", 9 type: "POST", 10 data : {"username":username, "password":password, "validcode":validcode}, 11 headers: {"X-CSRFToken": $.cookie("csrftoken")}, //配置csrftoken 12 success: function (data) { 13 console.log(data); 14 var response = JSON.parse(data); 15 if (response["is_login"]){ 16 self.location.href = ("/index/") 17 }else{ 18 $(".error").html(response["error_msg"]).css("color","red") 19 } 20 } 21 }) 22 }) 23 })
四、login登錄函數配置
1 def login(request): 2 if request.method == "GET": 3 return render(request, "login.html") 4 elif request.method == "POST": 5 print(request.POST) 6 # 1,獲取用戶輸入信息 7 username = request.POST.get("username") 8 password = request.POST.get("password") 9 validcode = request.POST.get("validcode") 10 session_validcode = request.session.get('validcode') 11 # 設置ajax請求的返回數據 12 login_response = {"is_login": False, "error_msg": None} 13 # 首先驗證驗證碼輸入是否正確 14 if validcode.upper() == session_validcode.upper(): 15 # 通過auth模塊,驗證用戶名和密碼是否正確 16 user = auth.authenticate(username=username, password=password) 17 print(user) 18 if user: 19 # 驗證成功則在返回數據中標志True 20 login_response['is_login'] = True 21 # 同時設置用戶session 22 auth.login(request, user) # request.session[is_login] = True 23 else: 24 login_response['error_msg'] = "用戶名或密碼錯誤" 25 else: 26 login_response['error_msg'] = "驗證碼錯誤" 27 print(login_response) 28 return HttpResponse(json.dumps(login_response))
