Django :验证码

如果使用Django 自带的csrf_token其实是不安全的,因为它实际上就是在HTML中嵌入一个hidden input,我把它复制下来照样也可以跨站请求,所以我们就需要更加安全的机制,验证码。
代码效果:
(图中蓝色高亮的部分就是csrf_token的实际代码)
这里写图片描述
以下为具体的实现步骤:
1,准备验证码图片
在views.py中添加如下代码:

from django.http import HttpResponse
import cStringIO
#以下导入内容分别为画布,画笔,字体
from PIL import Image,ImageDraw,ImageFont
import random

def verifycode(request):
    bgcolor = (random.randrange(20,100),random.randrange(20,100),255)
    width = 100
    height = 25
    im = Image.new('RGB',(width,height),bgcolor)
    draw = ImageDraw.Draw(im)
    #随机生成噪点
    for i in range(0,100):
        xy = (random.randrange(0,width),random.randrange(0,height))
        fill = (random.randrange(0,255),255,random.randrange(0,255))
        draw.point(xy,fill=fill)
#随机的字符串
    str1 = 'ABCD123EFGHI4567OPQR90'
    rand_str = ''
    #生成随机验证码中的内容
    for i in range(0,4):
        rand_str += str1[random.randrange(0,len(str1))]

    font = ImageFont.truetype('FreeMono.ttf',23)
    fontcolor = (255,random.randrange(0,255),random.randrange(0,255))
#用画笔画出这四个字符
    draw.text((5,2),rand_str[0],font=font,fill=fontcolor)
    draw.text((25,2),rand_str[1],font=font,fill=fontcolor)
    draw.text((50,2),rand_str[2],font=font,fill=fontcolor)
    draw.text((75,2),rand_str[3],font=font,fill=fontcolor)
    del draw
   #在session中存入验证码字符串
    request.session['verifycode'] = rand_str
    #python2中用的是这个,来将图片存入内存中
    buf = cStringIO.StringIO()

    im.save(buf,'png')
    return HttpResponse(buf.getvalue(),'image/png')

模板内容(session1.html):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" >

    </script>
</head>
<body>
{# 由于我实在工程中的app1中写的,所以图片路径要加上app1#}
<form action="/app1/verifycodeValid/" method="post">
    {% csrf_token %}
    <input type="text" name="Myvcc">
    <br>
    The picture:
    <img src="/app1/verifycode/" alt="" id="verifycode">
    <br>
    <span id="verifycodeChange">Change it</span>
    <br>
    <input type="submit" value="Submit">
</form>
</body>
</html>

剩下的验证码页面的显示以及验证码后台验证:
在views.py中添加以下内容:

#验证
def verifycodeValid(request):
    ve = request.POST['Myvcc']
    if ve.upper() == request.session['verifycode']:
        return HttpResponse('ok')
    else:
        return HttpResponse('no')

# 显示
def show_verify(request):
    return render(request,'session1.html')

一些路径的添加在urls.py中:

    url(r'^verifycode/$',views.verifycode),
    url(r'^verifycodeValid/$',views.verifycodeValid),
    url(r'show_verify',views.show_verify),
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值