简介:今天,首席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中添加验证代码的相关内容的摘要,我希望这对您有所帮助!关心这个问题?