使用django生成网页动态验证码

一般正常的对外服务网站都有几个基本的功能就是验证码,验证码的重要性,这里就不多说了。主要是防止恶意破解密码,论坛灌水等等功能,

制作网站验证码必须要尊重一点,就是复杂但不要过度影响用户体验,这里就不得不吐槽一下12306的神级验证码了。小编每次刷票没有个5,6次都不可能选对的,不知道各位有没有类似,或者更悲催的体验。

这次我们简单介绍一下django验证码的制作方法

技术点

其实django的第三方模块中有关于验证码的模块,django-simple-captcha,说实话不太好用切复杂。有兴趣的同学可以自行了解或在评论区留言。

这里咱们主要通过PIL来生成验证码的图片,利用传统的session方式来进行保存。(不知道PIL是什么的看官请自行百度)

环境描述

我们使用的是python2.7+ django1.8.3+PIL(Pillow 4.0.0)进行讲解,代码也是亲自验证可用的。具体模块安装不讲解,都比较简单 pip安装即可

首先创建django项目。编写第一个模块,处理图片模块

#!/usr/bin/env python

#-*- coding:utf-8 -*-

import random,string

from PIL importImage,ImageDraw,ImageFont,ImageFilter

#生成随机字符串

def getRandomChar():

#string模块包含各种字符串,以下为小写字母加数字

ran = string.ascii_lowercase+string.digits

char =''

for i in range(4):

char += random.choice(ran)

return char #返回一个随机的RGB颜色

def getRandomColor():

return(random.randint(50,300),random.randint(50,150),random.randint(50,150))

def create_code():

#创建图片,模式,大小,背景色

img =Image.new('RGB',(120,30),(255,255,255))

#创建画布

draw =ImageDraw.Draw(img)

#设置字体

font =ImageFont.truetype('E:PycharmProjects\untitled1dsafArial.ttf',25)

code = getRandomChar()

#将生成的字符画在画布上

for t in range(4):

draw.text((30*t+5,0),code[t],getRandomColor(),font)

#生成干扰点

for _ in range(random.randint(0,500)):

#位置,颜色

draw.point((random.randint(0,120), random.randint(0,30)),fill=getRandomColor())

#生成干扰线

line_num = random.randint(1,5)# 干扰线条数

for i in range(line_num):

# 起始点

begin =(random.randint(0,120), random.randint(0,30))

# 结束点

end =(random.randint(0,120), random.randint(0,30))

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

#使用模糊滤镜使图片模糊

# img = img.filter(ImageFilter.BLUR) ##这里为什么#上了呢,博主发现这个模糊有点过了 导致图片太不清晰。各位老铁可以实际写一下体验一下

#保存

img.save(''.join(code)+'.jpg','jpeg')

return img,code

if __name__ =='__main__':

create_code()

以上代码我们保存为check_code.py 放在views.py 同级,或者你自己定义位置。

这里注意上面代码使用到了Arial.ttf 字体文件,这个需要自行下载并写上绝对目录,否则生成时会报错。。

接下来编写views.py

import check_code

from io import BytesIO

from django.http import HttpResponse

def create_code_img(request):

#在内存中开辟空间用以生成临时的图片f = BytesIO()img,code = check_code.create_code()request.session['check_code'] = codeimg.save(f,'PNG')return HttpResponse(f.getvalue())

from django.shortcuts import render_to_response,render

def test_code(request):

#GET方法返回表单if request.method == 'GET': return render(request,'index.html')#POST方法用来验证提交的验证码是否正确else: code = request.POST.get('code','') if code == request.session.get('check_code','error'): return HttpResponse("yes") return HttpResponse("no")##### 然后咱们写个简单的页面 注意上面的代码 咱们命名为index.html```html 验证码登录 {% csrf_token %}

然后设置url 编辑urls.py

from dsaf import viewsurlpatterns = [ url(r'^create_code/$',views.create_code_img), url(r'^index/',views.test_code),]

ok 代码编写部分基本完成。由于以上代码使用到了session ,所以要生成一下django的数据库

python manage.py makemigrationspython manage.py migrate执行上面两条指令即可

全部搞定,咱们启动测试一下。

python manage.py runserver 0.0.0.0:8080

浏览器访问一下 http://127.0.0.1:8000/index/ 不出意外的话你将看到如下界面。

怎么样,如果你跟着本教程一起写是否看到了验证码界面呢。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180417A1P4TC00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券