使用Django怎么实现一个登录随机验证码功能

  介绍

这篇文章将为大家详细讲解有关使用Django怎么实现一个登录随机验证码功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

<强> 1。生成随机验证码

, # _ * _coding: utf-8_ * _   得到PIL  import 图像、ImageDraw ImageFont ImageFilter   import 随机   import 数学,字符串   #字体的位置,不同版本的系统会有不同   时间=font_path  & # 39;/图书馆/字体/Arial.ttf& # 39;=# font_path  & # 39;/图书馆/字体/Hanzipen.ttc& # 39;   #生成几位数的验证码   时间=number  4   #生成验证码图片的高度和宽度   30 size =, (100)   #背景颜色,默认为白色   bgcolor =, (255255255)   #字体颜色,默认为蓝色   fontcolor =, (0, 0255)   #干扰线颜色。默认为红色   linecolor =, (255, 0, 0)   #是否要加入干扰线   draw_line =,真的   #加入干扰线条数的上下限   时间=line_number  (5)      def  gen_text ():   source 才能=,列表(string.ascii_letters)   for 才能;index 拷贝范围(0,10):   ,,,source.append (str(索引))   return 才能;& # 39;& # 39;. join (random.sample(来源、数量))#数量是生成验证码的位数         #用来绘制干扰线   def  gene_line(画、宽度、高度):   begin 才能=,(random.randint(0,宽度),random.randint(0,高度))   最终获得才能=,(random.randint(0,宽度),random.randint(0,高度))   draw.line才能(开始,,,,fill =, linecolor)      def  gene_code (save_path,文件名):   宽度,才能height =, size  #宽和高   image 才能=,Image.new (& # 39; rgba # 39;,(宽度、高度),背景),#创建图片      font 才能=,ImageFont.truetype (font_path 25), #验证码的字体和字体大小   # font 才能=,ImageFont.truetype(25), #验证码的字体和字体大小   时间=draw 才能;ImageDraw.Draw(图片),#创建画笔   # text 才能=,“我是中国人“,#生成字符串   时间=text 才能;gen_text(), #生成字符串   打印才能(文本)   ,,font_width, font_height =, font.getsize(文本)   draw.text才能(((width 作用;font_width),/,,, (height 作用;font_height),/,数字),文本,\=,,,字体,字体,填补=fontcolor), #填充字符串      if 才能;draw_line:   ,,,gene_line(画,,宽度,高度)   ,,,gene_line(画,,宽度,高度)   ,,,gene_line(画,,宽度,高度)   ,,,gene_line(画,,宽度,高度)      image 才能=,image.transform ((width  +, 20日,height  + 10),, Image.AFFINE,, (1), -0.3, 0, -0.1,, 1,, 0),, Image.BILINEAR), #,创建扭曲   时间=image 才能;image.filter (ImageFilter.EDGE_ENHANCE_MORE), #,滤镜,边界加强   image.save才能(& # 39;% s/% s.png& # 39;, % (save_path文件名)),#,保存验证码图片   打印才能(“savepath:“save_path)   return 才能;文本      if  __name__ ==,“__main__":   gene_code才能(& # 39;/tmp # 39; & # 39;测试# 39;),#会把生成的图片存成/tmp/test.png

<强>,2。如何应用到你的django项目中

整个验证码的流程如下
1。用户访问登录页面,你的后台程序在给用户返回登录页面时,同时生成了验证码图片
2。用户输入账户信息和验证码数字,提交表单
3。后台判断用户输入的验证码和你生成的图片信息是否一致,如果一致,就代表验证码是没有问题的

问题就卡在第3步,你在第1步生成验证码并返回给用户后,由于一会用户还需要把这个验证码提交过来,你在后台就需要拿用户输入的和你之前生成的验证码进行对比是否相等,

所以你必须在生成验证码的同时,把验证码存下来,存到哪?必然是缓存,这样直接在存的同时加个超时时间,就可以限定验证码有效期了。

那存入缓存时的关键是设置成什么呢?为了保证验证码的安全,我采取了以下设计

使用Django怎么实现一个登录随机验证码功能

<强> 3。代码实现

登录视图

def  acc_login(请求):   err_msg 才能=,{}   时间=today_str 才能;datetime.date.today () .strftime (“% Y % m % d")   verify_code_img_path =,才能“% s/% s", % (settings.VERIFICATION_CODE_IMGS_DIR,   ,,,,,,,,,,,,,,,,,,today_str)   if 才能;not  os.path.isdir (verify_code_img_path):   ,,,os.makedirs (verify_code_img_path exist_ok=True)   打印才能(“会话:“request.session.session_key)   #才能打印(“会话:“request.META.items ())   random_filename 才能=,,,. join (random.sample (string.ascii_lowercase 4))   时间=random_code 才能;verify_code.gene_code (verify_code_img_path random_filename)   cache.set才能(random_filename, random_code, 30)      if 才能;request.method ==,“POST":      ,,,username =, request.POST.get(& # 39;用户名# 39;)   ,,,password =, request.POST.get(& # 39;密码# 39;)   ,,,_verify_code =, request.POST.get (& # 39; verify_code& # 39;)   ,,,_verify_code_key =, request.POST.get (& # 39; verify_code_key& # 39;)      ,,,print (“verify_code_key:“_verify_code_key)   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

使用Django怎么实现一个登录随机验证码功能