利用Pillow,几行代码实现的最简单的Django页面验证码功能

验证码本质上就是生成带有文字的图片,用来区分人与机器的行为。如果考虑到防止破解自然会涉及到许多复杂的算法,用以防止从图片中容易地识别出文字,但作为一个简单的例子,我们就使用最简单的方法来达成一个验证码的功能。以下就是利用Python的第三方图形处理模块Pillow来实现的一个简单的验证码功能:


首先,在accounts.views中定义一个生成验证码的函数:

from PIL import Image, ImageDraw, ImageFont
from django.http.response import HttpResponse
from settings import BASE_DIR
import cStringIO, string, os, random

def captcha(request):
    '''Captcha'''
    image = Image.new('RGB', (147, 49), color = (255, 255, 255)) # model, size, background color
    font_file = os.path.join(BASE_DIR, 'static/fonts/ARIAL.TTF') # choose a font file
    font = ImageFont.truetype(font_file, 47) # the font object
    draw = ImageDraw.Draw(image) 
    rand_str = ''.join(random.sample(string.letters + string.digits, 4)) # The random string
    draw.text((7, 0), rand_str, fill=(0, 0, 0), font=font) # position, content, color, font
    del draw
    request.session['captcha'] = rand_str.lower() # store the content in Django's session store
    buf = cStringIO.StringIO() # a memory buffer used to store the generated image
    image.save(buf, 'jpeg')
    return HttpResponse(buf.getvalue(), 'image/jpeg') # return the image data stream as image/jpeg format, browser will treat it as an image

接下来,在项目的urls.py中,做好url映射即可:

urlpatterns += patterns('accounts.views',
    url(r'^accounts/captcha/$', 'captcha'),
    ...
)


在模板中的使用,也非常直观:

	<div class="form-group">
		<img οnclick="this.setAttribute('src','/accounts/captcha/?nocache='+Math.random());" src="/accounts/captcha/" alt="Captcha"/>	
	</div>

这样就能在页面上显示出相应的验证码图片。这样,通过用户在提交表单之前,输入的图片中的内容,在请求到达服务器之后,与其当前session中的内容比对,就可以判断用户是否输入了正确的验证码,继而进行相应的处理。


以上验证码图片的生成需要用到第三方的Pillow模块,可以通过 pip install Pillow来安装,在这个过程中可能需要安装一些系统共享库来支持某些类型的图片格式,如果编译出现问题,在编译过程中都会有体现。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值