作个记录,这个东东,是可以到处照搬的。

WINDOWS下和LINUX下,字体对象获取方式不一样。

为了用户体验,字体大小也重要的。

另外,为了照顾个别字母认不出来的人,提供刷新功能。

一,验证码函数

def verify_code(request):from PIL import Image, ImageDraw, ImageFont# 引入随机函数模块import random# 定义变量,用于画面的背景色、宽、高bgcolor = (random.randrange(40, 200), random.randrange(40, 200), 255)width = 200height = 40# 创建画面对象im = Image.new('RGB', (width, height), bgcolor)# 创建画笔对象draw = ImageDraw.Draw(im)# 调用画笔的point()函数绘制噪点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 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0'# 随机选取4个值作为验证码rand_str = ''for i in range(0, 4):rand_str += str1[random.randrange(0, len(str1))]# 构造字体对象,一个默认的(字体太小),一个LINUX下的,一个WINDOWS下的。23号可以了。# font = ImageFont.load_default().font# font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 23)font = ImageFont.truetype('C:\Windows\Fonts\Arial.ttf', 23)# 构造字体颜色fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))# 绘制4个字,要注意间距draw.text((20, 10), rand_str[0], font=font, fill=fontcolor)draw.text((70, 10), rand_str[1], font=font, fill=fontcolor)draw.text((120, 10), rand_str[2], font=font, fill=fontcolor)draw.text((170, 10), rand_str[3], font=font, fill=fontcolor)# 释放画笔del draw# 存入session,用于做进一步验证request.session['verify_code'] = rand_str# 内存文件操作import iobuf = io.BytesIO()# 将图片保存在内存中,文件类型为pngim.save(buf, 'png')# 将内存中的图片数据返回给客户端,MIME类型为图片pngreturn HttpResponse(buf.getvalue(), 'image/png')

二,前端写法

<div class="row cl"><label class="form-label col-xs-3"></label><div class="formControls col-xs-2"><input type="text" name="vc" placeholder="验证码" rows="1" class="input-text size-L" required id="id_vc"></div><div class="formControls col-xs-5"><img id='verify_code' src="{% url 'verify_code' %}?1" alt="CheckCode"/><span id='verify_codeChange'><i class="icon Hui-iconfont"></i></span></div></div>

<script type="text/javascript">$(function(){$('#verify_codeChange').css('cursor','pointer').click(function() {$('#verify_code').attr('src',$('#verify_code').attr('src')+1)});});
</script>

三,后台session验证

        if vc.upper() != request.session['verify_code']:error.append('验证码错误!')return render(request, "accounts/login.html", error)

四,样子

转载于:https://www.cnblogs.com/aguncn/p/10317502.html

django项目验证码(PIL库实现)相关推荐

  1. Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)...

    Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt) 作者: Desmond Chen, 发布日期: 2014-05 ...

  2. 部署Django项目到华为云服务器教程

    Ubuntu 20.04 + Python3.7 + mysql5.7 + Django4.1.3 + 宝塔Linux面板 文章目录 1.连接华为云服务器 2.安装宝塔linux面板 3.安装项目对应 ...

  3. 83.Django项目中使用验证码

    1. 概述 ​ 验证码(CAPTCHA)是"Completely Automated Public Turing test to tell Computers and Humans Apar ...

  4. Django项目实现验证码

    1. django-simple-captcha 模块 安装 django-simple-captcha pip install django-simple-captcha pip install P ...

  5. 使用Python PIL库实现简单验证码的去噪处理

    想要识别验证码,收集足够多的样本后,首先要做的就是对验证码原始图片进行处理,对验证码识别分类之前,一般包括:将彩色图片转换成灰度图.将灰度图二值化和去除噪点三个基本过程.这里仅以比较简单的验证码为例, ...

  6. python中如何安装django库_python安装好django库,新建django项目

    我安装好django库之后,想在pycharm里新建django项目,发现没有django选项.百度后发现只有专业版才可以直接创建django项目,社区版推荐用命令创建,如下: 1. 在DOS黑窗口下 ...

  7. Python使用Pillow(PIL)库实现验证码图片

    Python使用Pillow(PIL)库实现验证码图片 Pillow库有很多用途,本文使用Pillow来生成随机的验证码图片. Pillow的用法参考:https://blog.csdn.net/we ...

  8. python123九宫格输入_使用python PIL库实现简单验证码的去噪方法步骤

    字符型图片验证码识别完整过程及Python实现的博主,我的大部分知识点都是从他那里学来的. 想要识别验证码,收集足够多的样本后,首先要做的就是对验证码原始图片进行处理,对验证码识别分类之前,一般包括: ...

  9. Django项目后端实现注册功能---短信验证码(容联云)。

    django项目gitee仓库地址:https://gitee.com/YANGYUE0205/meiduo_project.git 一, 总体逻辑分析. 要点: 1.为了避免用户使用图形验证码恶意测 ...

最新文章

  1. 解析Erlang日志组件lager的lager_transform模块
  2. Jupyter Notebook中cell操作
  3. Struts2_day04--课程介绍_Struts2拦截器概述底层原理_重要的概念
  4. 关于不能远程连接Linux中Mysql数据库的问题
  5. 贡献思想 + 数论 + 思维(例题 Problem J. Prime Game)
  6. 这些 Linux 的“自动化”技巧,教你轻松完成任务
  7. python3.6环境变量设置win10_python——python3.6环境搭建(Windows10,64位)
  8. 红帽加速开放混合云创新,助力企业成功迈向开源应用时代
  9. 黑马程序员——选择排序
  10. python-temp-0626随堂
  11. js事件里面套事件怎么不管用_原生js利用localstorage实现简易TODO list应用
  12. C++实验课任务(多态--容器--算法)
  13. 案例分享|某医药集团的BI建设案例
  14. 第 5 章 输入输出管理
  15. 最长公共子串(10分)
  16. 每日一“酷”之string
  17. 1020 月饼 (25 分)—PAT (Basic Level) Practice (中文)
  18. Vue3简单实现元素周期表
  19. Vue中的SEO优化
  20. habor镜像仓库部署

热门文章

  1. 使用ISynchronizeInvoke无痛地创建线程安全用户界面
  2. 使用Canvas扩展绘制动态ASP.NET Core Blazor气泡图
  3. Vue 3 源码公布
  4. 中国计算机学会推出 CSP 非专业级别认证
  5. 深入研究微服务架构——第三部分
  6. ajax jinja,在向Flask发出jQuery AJAX请求后渲染Jinja
  7. python中的update是什么意思_python 字典中的Update()函数
  8. vue router children 路由变了 组件没变_Vue.js从零开始——路由(2)
  9. 微信中打开h5页面,直接关闭窗口js
  10. 服务器维护经验分享,医院IT运维经验分享.pdf