当前位置: 首页 > 网络应用技术

如何在Django中添加验证代码(2023年的最新饰面)

时间:2023-03-06 19:17:57 网络应用技术

  简介:今天,首席CTO Note将与您分享如何在Django中添加验证代码。如果您可以解决您现在面临的问题,请不要忘记注意此网站。让我们现在开始!

  在当前的网页中,为了防止机器人提交表单,图片验证代码是响应的常见手段之一。我不会在此处详细介绍它。我相信每个人都遇到了它。

  现在,将代码带有Python的PIL库,以实现验证代码的代码图片。代码中有详细的注释。

  #!/usr/bin/env Python

  #coding = UTF-8

  导入随机

  从PIL导入图像,ImageDraw,ImageFont,ImageFilter

  _letter_cases =“ abcdefghjkmnpqrstuvwxy”#<cretest Letters,删除可能的干扰I,L,O,Z

  _UPPER_CASE = _letter_cases.upper()#大_

  _numbers =''.join(Map(str,range(3,10)))#Datter

  init_chars =''.join((_ letter_cases,_upper_cases,_numbers))

  def create_validate_code(size =(120,30),

  chars = init_chars,

  img_type =“ gif”,

  模式=“ RGB”,

  bg_color =(255,255,255),

  fg_color =(0,0,255),

  font_size = 18,

  font_type =“ ae_alarabiya.ttf”,

  长度= 4,

  draw_lines = true,

  n_line =(1,2),

  draw_points = true,

  point_chaance = 2):

  '''

  @todo:生成验证代码图片

  @Param大小:图片的大小,格式(宽度,高度),默认(120,30)

  @param chars:允许的字符集,格式字符串

  @param img_type:图片保存的格式,默认值为gif,选项为gif,jpeg,tiff,png

  @param模式:图片模式,默认为RGB

  @param bg_color:背景颜色,默认为白色

  @param FG_Color:潜在颜色,验证代码字符颜色,默认为蓝色#0000FF

  @param font_size:验证代码字体大小

  @param font_type:验证代码字体,默认为ae_alalalabiya.ttf

  @param长度:验证代码字符编号

  @param draw_lines:是否转移线

  @param n_lines:干扰行的数量,格式元素组,默认值(1,2),只有draw_lines是有效的

  @param draw_points:是否绘制干扰点

  @Param Point_chance:干扰点的概率,大小范围[0,100]

  @return:[0]:pil图像实例

  @return:[1]:验证代码图片中的字符串

  '''

  宽度,高度=尺寸#宽,高度

  img = image.new(模式,大小,bg_color)#创建图形

  draw = imagedraw.draw(img)#创建刷子

  def get_chars():

  '''生成给定的长度字符串,返回列表格式''''

  返回率。样本(字符,长度)

  def create_lines():

  ''绘制干扰线'''

  line_num = random.randint(*n_line)#l l l l

  对于我的范围(line_num):

  # 初始点

  开始=(Random.Randint(0,size [0]),Random.Randint(0,size [1]))

  #结

  end =(random.randint(0,size [0]),random.randint(0,size [1]))

  draw.line([[begin,end],填充=(0,0,0,0))

  def create_points():

  ''绘制干扰点'''

  机会= min(100,最大(0,int(point_chance))))##c c C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C。

  对于xrange(宽度)中的w:

  对于Xrange(高度)中的H:

  tmp = random.randint(0,100)

  如果TMP 100 -Chance:

  draw.point((W,H),填充=(0,0,0))

  def create_strs():

  ''绘制验证代码字符''''

  c_chaars = get_chars()

  strs ='%s'%''.join(c_chars)#由每个字符之前和之后的空间分开

  font = imagefont.truetype(font_type,font_size)

  font_width,font_height = font.getSize(strs)

  draw.text((width -font_width) / 3,(高度-font_height) / 3),

  strs,font =字体,填充= fg_color)

  返回 '??'。加入(C_CHARS)

  如果draw_lines:

  create_lines()

  如果draw_points:

  create_points()

  strs = create_strs()

  #图形扭曲参数

  params = [1 -float(random.randint(1,2)) / 100,

  0,

  0,

  0,

  1 -float(Random.Randint(1,10)) / 100,

  float(Random.Randint(1,2)) / 500,

  0.001,

  float(Random.Randint(1,2)) / 500

  这是给予的

  img = img.transform(size,image.perspective,params)#创建失真

  img = img.filter(imagefilter.edge_enhance_more)#过滤器,边界增强(较大阈值)

  返回IMG,strs

  如果__name__ ==“ __ -main __”:

  code_img = create_validate_code()

  code_img.save(“ value.gif”,“ gif”)

  最终结果返回一个元组。第一个返回值是图像类的实例,第二个参数是图片中的字符串(是否正确)。

  最终结果返回一个元组。第一个返回值是图像类的实例,第二个参数是图片中的字符串(是否正确)。

  应该提醒的是,如果生成imageFont.TrueEyype实例时会引发IOERROR异常,则可能是计算机运行代码不包括指定的字体,需要下载和安装。

  生成代码的身份验证代码的效果:

  目前,仔细的同学可能会问,如果生成了验证代码,则必须先保存生成的图片,然后显示页面。这是不可接受的。这次,我们需要使用Python的python build -in stringio模块。它具有类似于文件对象的行为,但它操作内存文件。因此,我们可以像这样编写代码:

  尝试:

  导入CSTRINGIO作为Stringio

  除非Inflterror:

  导入Stringio

  mstream = stringio.stringio()

  img = create_validate_code()[0]

  img.Save(Mstream,“ GIF”)

  这样,当我们需要输出时,我们只需要使用“ mstream.getValue()”。例如,在django中,我们首先定义此URL:

  来自django.conf.urls.defaults导入 *

  urlpatterns =模式('example.views',

  url(r'^value/$','value,name ='value'),name ='value'),

  治愈

  在视图中,我们将正确的字符串保存在会话中,以便当用户提交表单时,我们可以与会话中的正确字符串进行比较。

  从django.shortcuts导入httpresponse

  从价值导入create_validate_code

  def validate(请求):

  mstream = stringio.stringio()

  validate_code = create_validate_code()

  img = value_code [0]

  img.Save(Mstream,“ GIF”)

  request.session ['value'] = value_code [1]

  返回httpresponse(mstream.getValue(),“ image/gif”)

  render_to_response('bb.html',{'news':( buf.getValue(),'image/gif')})

  关于这句话有一些问题。回。

  另外,您的bb.html中的内容是什么?只有一个句子?

  如果是这样。

  r = render_to_response('bb.html',{'news':( buf.getValue(),'image/gif')})})})})})})

  然后引用r,尝试将其内容类型重写为“ image/gif”

  也许成功。也许。

  Java如何实现验证代码验证函数?在日常生活中,可以在任何地方看到验证代码,可以在一定程度上保护帐户安全性,那么他如何实现它?

  Java实现验证代码验证功能实际上非常简单:图形类用于在图板上绘制字母,随机选择一定数量的字母随机生成,然后随机在图纸上随机生成多个干扰行。

  首先,编写验证代码以生成帮助类以绘制随机字母:

  导入Java.awt.Color;

  导入java.awt.font;

  导入java.awt.graphics;

  导入java.awt.image.buffredimage;

  导入java.io.ioexception;

  导入java.io.outputstream;

  导入java.util.random;

  导入javax.imageio.imageio;

  公共最终类Graphichelper {

  /**

  *备份以字符串形式生成的验证代码,并同时输出图片

  *

  *@param width

  *图片的宽度

  *@param Height

  *图片的高度

  *@param imgtype

  *图片的类型

  *@param输出

  *图片的输出流(图片将输出到此流)

  *@返回到生成(字符串)生成的验证代码

  */

  public static String create(最终int宽度,最终int高度,最终字符串imgtype,outputStream输出){{{{{{{{{{{{{{{{{{{{{{{{{{{

  StringBuffer SB = new StringBuffer();

  随机随机= new Random();

  bufferedimage image =新的bufferedimage(宽度,高度,buffredimage.type_int_rgb);

  图形图= image.getGraphics();

  graphic.setColor(color.getColor(“ f8f8f8”);

  graphic.fillrect(0,0,宽度,高度);

  颜色[]颜色=新颜色[] {color.blue,color.gray,color.green,color.red,color.black,color.orange,color.orange,

  color.cyan};

  //在“绘画板”上生成干扰线(50是线的数量)

  for(int i = 0; i 50; i ++){

  graphic.setColor(颜色[random.nextint(colors.length)];

  final int x = random.nextint(width);

  最终int y = random.nextint(高度);

  最终int w = random.nextint(20);

  最终int h = random.nextint(20);

  finalstal = random.nextboolean()?1:-1;

  final istalb = random.nextboolean()?1:-1;

  graphic.drawline(x,y,x+w*signa,y+h*signb);

  }

  //在“绘画板”上画字母

  graphic.setFont(new font(“ Comic Sans MS”,Font.Bold,30);

  for(int i = 0; i 6; i ++){

  最终int tempMp = random.nextint(26)+97;

  字符串s = string.valueof(char);

  sb.Append(S);

  graphic.setColor(颜色[random.nextint(colors.length)];

  graphic.drawString(s,i*(width/6),高度 - (高度/3));

  }

  graphic.dispose();

  尝试 {

  image.write(image,imgtype,输出);

  } catch(ioexception e){{{

  e.printstacktrace();

  }

  返回sb.tostring();

  }

  }

  然后,创建一个servlet来固定图片的大小,使用验证代码的使用以及捕获页面生成的验证代码(捕获的QR代码与用户输入的验证代码一致)。

  导入java.io.outputstream;

  导入Javax.Servlet.ServletException;

  导入javax.servlet.annotation.webservlet;

  导入javax.servlet.http.httpservlet;

  导入javax.servlet.http.httpservletrequest;

  导入javax.servlet.http.httpservletresponse;

  导入javax.servlet.http.httpsession;

  @webservlet(urlpatterns =“/verify/regist.do”)

  public Class verifyCodeservlet扩展了httpservlet {

  私有静态最终长序列化= 3398560501558431737L;

  @Override

  受保护的空隙服务

  投掷ServletException,ioexception {

  //获取与当前请求相对应的会话对象

  httpsession session = request.getSession();

  //从请求获取URI(统一资源标识符)

  字符串uri = request.getRequesturi();

  system.out.println(“ Hello:”+uri);

  最终int宽度= 180;//图片宽度

  最终int高度= 40;//图片高度

  最终字符串imgtype =“ jpeg”;//指定图片格式(不是MIME类型)

  Final UptufStream输出= response.getPutStream();//获取可以将图片返回到客户的输出流

  //(字节流)

  //创建验证代码图片并返回图片上的字符串

  字符串代码= graphichelper.create(宽度,高度,imgtype,输出);

  system.out.println(“验证代码内容:”+代码);

  //创建URI关联和相应的验证代码(存储在当前会话对象的属性中)

  session.settattribute(uri,代码);

  system.out.println(session.getAttribute(uri));

  }

  }

  然后编写一个HTML注册页面以测试:

  html

  头

  meta charset =“ utf-8”

  标题注册/标题

  链接rel =“ stylesheet” href =“ styles/eneral.css”

  链接rel =“ stylesheet” href =“ styles/cell.css”

  链接rel =“ stylesheet” href =“ styles/form.css”

  脚本类型=“ text/javascript” src =“ JS/ref.js”/脚本

  样式类型=“ text/css”

  .logo-control {

  保证金顶:50px;

  }

  .logo-container img {

  宽度:100px;

  }

  .message-container {

  身高:80px;

  }

  .link-control {

  身高:40px;

  线高:40px;

  }

  .link-container a {

  文本解释:无;

  }

  /风格

  /头

  身体

  div class =“容器形式 - 容器”

  Form Action =“/Wendao/regist.do” Method =“ post”

  DIV类=“形式”! - 注册形式开始 -

  div class =“ form-download”

  SPAN类=“ Cell-1”

  我class =“ fa fa-user”/i

  /跨度

  span class =“ cell-11”样式=“ text-align:left;”

  输入类型=“ text” name =“用户名”占位符=“请输入用户名”

  /跨度

  /div

  div class =“ form-download”

  SPAN类=“ Cell-1”

  我class =“ fa fa-key”/i

  /跨度

  span class =“ cell-11”样式=“ text-align:left;”

  输入类型=“密码”名称=“密码”占位符=“请输入密码”

  /跨度

  /div

  div class =“ form-download”

  SPAN类=“ Cell-1”

  我class =“ fa fa-keyboard-o”/i

  /跨度

  span class =“ cell-11”样式=“ text-align:left;”

  输入类型=“密码”名称=“确认”占位符=“请确认密码”

  /跨度

  /div

  div class =“ form-download”

  SPAN类=“ Cell-7”

  输入类型=“ text” name =“ verifyCode”占位符=“请输入验证代码”

  /跨度

  SPAN类=“ Cell-5”样式=“ Text-Align:Center;”

  img src =“/demo/verify/regist.do” onclight =“ myrefersh(this)”

  /跨度

  /div

  div class =“ form-download” style =“ border:none;”

  SPAN类=“ Cell-6”样式=“ Text-Align:左”

  输入类型=“ reset” value =“ reset”

  /跨度

  span class =“ cell-6”样式=“ text-align:right;”“

  输入类型=“提交”值=“注册”

  /跨度

  /div

  /div! - 注册表格结束---

  /形式

  /div

  /身体

  /html

  效果如下所示:

  控制台收到的图片中收到的验证代码的更改如下:

  在单击“刷新页面”时,验证代码将会更改,但是当我们看不到验证代码时,只需单击验证代码刷新,以便可以使用JavaScript实现本地刷新。

  在IMG中

  在src =“/demo/verify/regist.do”中,添加问号和一个后缀号码。刷新时,后缀编号会继续更改,然后形成的验证代码将继续由日期替换。日期获得了这台计算机的时间。时间随时更改,因此刷新验证代码可以随时更改。

  代码显示如下:

  功能myrefersh(e){

  const source = e.src;//获取原始SRC中的内容

  //console.log(“源:”+source);

  var index = source.indexof(“?”);//从源查找?

  //console.log(“ index:”+index);

  if(index -1){//是否找到?进入内部

  var s = source.substring(0,index);//索引之前的内容从源头截获(索引和索引后的内容)

  //console.log(“ s:”+s);

  var date = new Date();//创建一个日期对象的实例

  var time = date.getTime();//从新创建的日期对象的实例中获取与毫秒值相对应的时间

  e.src = s+“?time =”+time;//将尾巴的地址放在SRC上

  //console.log(e.src);

  } 别的 {

  var date = new Date();

  e.src = source+“?time =”+date.getTime();

  }

  }

  如果答案不是详细的,您可以询问

  结论:以上是有关每个人的首席CTO注释中如何添加django中添加验证代码的相关内容的摘要,我希望这对您有所帮助!关心这个问题?