Django中生成随机验证码

Posted hongdoudou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django中生成随机验证码相关的知识,希望对你有一定的参考价值。

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(rC:WindowsFontsArial.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))

以上是关于Django中生成随机验证码的主要内容,如果未能解决你的问题,请参考以下文章

java 中生成随机验证码

.NET Core 中生成验证码

MVC中生成图形验证码并验证(详细)

MVC中生成图形验证码并验证(详细)

MVC中生成图形验证码并验证(详细)

MVC中生成图形验证码并验证(详细)