django + PIL 生成网页动态验证码

Posted python自动化运维之美

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django + PIL 生成网页动态验证码相关的知识,希望对你有一定的参考价值。

众所周知,一般正常的对外服务网站都有几个基本的功能就是验证码,验证码的重要性,这里就不多说了。主要是防止恶意破解密码,论坛灌水等等功能,
制作网站验证码必须要尊重一点,就是复杂但不要过度影响用户体验,这里就不得不吐槽一下12306的神级验证码了。博主每次刷票没有个5,6次都不可能选对的。这种就有点严重影响用户体验了。
说回整体,本节我们简单介绍一下django验证码的制作方法

技术点

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

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

环境描述

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

开始

首先创建django项目。编写第一个模块,处理图片模块
 
   
   
 
  1. #!/usr/bin/env python

  2. #-*- coding:utf-8 -*-

  3. import random,string

  4. from PIL import Image,ImageDraw,ImageFont,ImageFilter

  5. #生成随机字符串

  6. def getRandomChar():

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

  8.    ran = string.ascii_lowercase+string.digits

  9.    char = ''

  10.    for i in range(4):

  11.        char += random.choice(ran)

  12.    return char

  13. #返回一个随机的RGB颜色

  14. def getRandomColor():

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

  16. def create_code():

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

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

  19.    #创建画布

  20.    draw = ImageDraw.Draw(img)

  21.    #设置字体

  22.    font = ImageFont.truetype('E:\PycharmProjects\untitled1\dsaf\Arial.ttf', 25)

  23.    code = getRandomChar()

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

  25.    for t in range(4):

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

  27.    #生成干扰点

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

  29.        #位置,颜色

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

  31.    #生成干扰线

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

  33.    for i in range(line_num):

  34.        # 起始点

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

  36.        # 结束点

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

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

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

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

  41.    #保存

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

  43.    return img,code

  44. if __name__ == '__main__':

  45.    create_code()

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

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

接下来编写views.py
 
   
   
 
  1. ```python

!/usr/bin/env python

-- coding:utf-8 --

import check_code
from io import BytesIO
from django.http import HttpResponse

def create_code_img(request):

 
   
   
 
  1. #在内存中开辟空间用以生成临时的图片

  2. f = BytesIO()

  3. img,code = check_code.create_code()

  4. request.session['check_code'] = code

  5. img.save(f,'PNG')

  6. return HttpResponse(f.getvalue())

from django.shortcuts import render_to_response,render
def test_code(request):

 
   
   
 
  1. #GET方法返回表单

  2. if request.method == 'GET':

  3.    return render(request,'index.html')

  4. #POST方法用来验证提交的验证码是否正确

  5. else:

  6.    code = request.POST.get('code','')

  7.    if code == request.session.get('check_code','error'):

  8.        return HttpResponse("yes")

  9.    return HttpResponse("no")

 
   
   
 
  1. ##### 然后咱们写个简单的页面 注意上面的代码 咱们命名为index.html

  2. ```html

  3. <!DOCTYPE html>

  4. <html lang="en">

  5. <head>

  6.    <meta charset="UTF-8">

  7.    <title>验证码登录</title>

  8. </head>

  9. <body>

  10. <form method="post" action="#">

  11.    {% csrf_token %}

  12.    <img id="check_code_img" onclick="refresh_check_code(this)">

  13.    <input type="text" name="code">

  14.    <input type="submit">

  15. </form>

  16. <script>

  17.    function refresh_check_code(ths) {

  18.        ths.src += '?';

  19.        //点击图片刷新功能

  20. }

  21. </script>

  22. </body>

  23. </html>

然后设置url 编辑urls.py
 
   
   
 
  1. from dsaf import views

  2. urlpatterns = [

  3.    url(r'^create_code/$',views.create_code_img),

  4.    url(r'^index/',views.test_code),

  5. ]

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

  2. python manage.py migrate

  3. 执行上面两条指令即可

全部搞定,咱们启动测试一下。
 
   
   
 
  1. python manage.py runserver 0.0.0.0:8080

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

怎么样,如果你跟着本教程一起写是否看到了验证码界面呢。
bingo 本次讲解到这里就完成啦,欢迎在评论区留言互动。

学无止境,同志们仍需努力。最重要的一点是学习python 要多写而不是一味的看!!


欢迎点击【阅读原文】访问魏先森个人独立博客,查看更多python教程

以上是关于django + PIL 生成网页动态验证码的主要内容,如果未能解决你的问题,请参考以下文章

利用 PIL模块实现生成动态验证码

Django随机生成验证码图片

django随机验证码

Django 生成验证码或二维码 pillow模块

django-生成随机验证码

PIL 生成随机验证码图片