环境:win10(64位)+pycharm2018+pillow5.4+python3.7

对Django的跨站请求保护的有所了解的同学会知道{%csrf_token%}在实际上作用并不是那么大,只要我们拿到了cookie的值添加进去就可以避开这种保护机制,所有有了更安全的-------验证码

python实现验证码功能有赖于第三方库Pillow,可以通过它来绘制图像,添加颜色文字并呈现在我们的web网站上。下面是pillow的官方文档https://pillow.readthedocs.io/en/latest/handbook/index.html

言归正传:实现验证码功能依靠pillow的三个类Image,ImageDraw,ImageFont,分别用于创建画布,画笔,字体。

其中有坑的地方。。。

1:font字体的定义要自己去看自己的电脑支持什么(window的字体在    C:\Windows\Fonts 下)ubuntu在/usr/share/fonts,自己去看支持什么就写什么,不要乱写。

2:ImageDraw.Draw.text()方法,别看官方文档给你那么多参数,,并没有啥用,你只要记住,设置坐标,内容,颜色,字体就万事大吉了

3:在利用内存存储生成的图像时会利用io模块下的StringIO(至少有些教程是这样写的),在这不能用StringIO,因为内存,我们操作的字节,,,所以要用ByteIO方法去保存我们的img

代码如下:

view.py

def varity(request):
from PIL import Image,ImageDraw,ImageFont #导入画布,画题,字体
import random
#背景颜色
bgcolor=(random.randrange(10,160),random.randrange(50,160),255)
#宽高
width = 140
height = 60
#创建画板
img = Image.new(mode='RGB',size=(width,height),color=bgcolor)
#创建画笔
draw = ImageDraw.Draw(img,mode='RGB')
#定义字符
text = 'ABCD1234'
# 字体对象,字体,字号
font1 = ImageFont.truetype('AdobeGothicStd-Bold.otf',40)
#temp用来存储随机生成的验证码
temp = ''
for i in range(4):
# 每循环一次,从a到z中随机生成一个字母或数字
# 65到90为字母的ASCII码,使用chr把生成的ASCII码转换成字符
# str把生成的数字转换成字符串
temp1= text[random.randrange(0,len(text))]
# 把生成的随机码存起来
temp += temp1
#每一次生成新的颜色
color1 = (random.randint(0,255),random.randint(0,255),random.randint(0,255))
#把文字写到img中
draw.text((i*24, i*6),temp1,color1,font1)
#保存到内存流
import io
buf = io.BytesIO()
img.save(buf,'png')
#将验证保存并传递
request.session['code']=temp
#将得到的对象返回
return HttpResponse(buf.getvalue(),'image/png')
def varity1(request):
return render(request,'booktest/varity1.html')
def varity2(request):
name = request.POST['varity']
name1=request.session['code']
if name == name1:
return HttpResponse('ok')
else:
return HttpResponse('error')

 

urls.py

urls.py

from django.urls import  re_path
from .import views
urlpatterns = [
re_path(r'^$',views.index,name='index'),
# re_path(r'^(\d+)$',views.show,name = 'show'),
# re_path(r'^index2$',views.index2),
# re_path(r'^index1',views.index1),
# re_path(r'^user$',views.user),
# re_path(r'^csrf1$',views.csrf1),
# re_path(r'^csrf2$',views.csrf2),
re_path(r'^varity$',views.varity),
re_path(r'^varity1$',views.varity1),
re_path(r'^varity2$',views.varity2), ]

varity1.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="varity2" method="post">
{% csrf_token %}
<input type="text" name="varity" value="验证码">
<img src="varity" alt="">
<input type="submit">
</form>
</body>
</html>

运行截图:


 

python验证码图片生成的更多相关文章

  1. 验证码图片生成工具类——Captcha.java

    验证码图片生成工具,使用JAVA生成的图片验证码,调用getRandcode方法获取图片验证码,以流的方式传输到前端页面. 源码如下:(点击下载  Captcha.java) import java. ...

  2. .Net中验证码图片生成

    开发网站或平台系统,登录页面是必不可少的功能,但是现在很多人可以使用工具暴力破解网站密码,为了防止这类非法操作,需要在登录页面添加验证,验证码就是最常用的一种验证方式. 我结合了自己的经验和网上的验证 ...

  3. asp.net验证码图片生成示例

    验证码,一个很常见的东西.不管你是使用者还是开发者,这个东西80%的人都见到过,但是之前有人给我说过这么一句话“内行看门道,外行看热闹!”,仔细琢磨一下还真的是那么一回事.对于怎么实现验证码,闲话不多 ...

  4. c# 验证码图片生成类

    using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D ...

  5. mvc验证码图片生成

    /// <summary> ///生成验证码 /// </summary> public class VerifyCode { /// <summary> /// ...

  6. django 验证码图片生成视图函数

    def verify_code(request): import random # 定义验证码图片背景颜色 宽和高 bgcolor = (random.randrange(20,180),random ...

  7. 通过python将图片生成字符画

    基础知识: 1.python基础知识   快速学习链接:https://www.shiyanlou.com/courses/214 2.linux命令行操作   快速学习链接:https://www. ...

  8. python识别图片生成字符模式

    此python文件来自D7哥, 放在这里备份. 用法 python3 PIL\&argparse.py 1.jpg -o test.txt --width 300 --height 300 p ...

  9. python imageio 图片生成gif

    #!/bin/python3 import matplotlib.pyplot as plt import imageio,os TIME_GAP=0.075 #两帧之间的时间间隔,秒为单位 FILE ...

随机推荐

  1. 【NX二次开发】判断部件是否已修改(判断部件是否需要保存)UF_PART_is_modified();

    判断部件是否已修改(判断部件是否需要保存)UF_PART_is_modified(); 注意:函数需要输入原型,不要输入事例.事例转原型:UF_ASSEM_ask_prototype_of_occ() ...

  2. 小程序微信支付(UNIAPP+第三方SDK:binarywang)

    小程序支付流程图说明(UNIAPP+第三方SDK:binarywang) 说明:小程序为UNI-APP开发,使用的第三方微信支付SDK为binarywang提供的,此SDK对微信公众号.小程序.微信各 ...

  3. docker0-常用命令-持续更新

    问君哪得清如许,为有源头活水来 1,帮助命令 docker version docker info docker 命令 --help 2,仓库\镜像 docker images 查看所有本地镜像 do ...

  4. 2020年11月CKA新题考试心得体会

    1 什么是CKA CKA,即Certificated Kubernetes Administrator,CNCF官方提供的Kubernetes技能认证,含金量还是不错的.还有CKAD,相对简单一些,没 ...

  5. 在微信小程序中使用阿里图标库Iconfont

    首先想要使用图标,只用上图的五个iconfont相关文件就可以了.(下下来的文件iconfont.wxss开始是.css的后缀,手动改成.wxss就可以在小程序中使用) 然后在app.wxss中引入i ...

  6. js笔记19 事件对象

    1.常用的事件 onmouseover  onmouseout  onmousedown  onmousemove  onmouseup   onclick  onchange  onfocus  o ...

  7. 一、JavaSE语言基础之关键字与标示符

    1.关键字   所谓关键字指Java中被赋予了特殊含义的单词或字符,Java中常见的关键字共53个,不需要进行记忆,在写代码的过程中会逐渐接触. 2.标示符   标示符,简单来说就是名字:其最大的作用 ...

  8. 快速了解ARP

    目录 前言 一.MAC 1.MAC地址三种帧 二.ARP 1.五种ARP 三.ARP老化 四.什么时候会发送免费ARP 五.代理ARP 六.ARP欺骗 总结 前言 分别介绍MAC地址和五种ARP报文 ...

  9. java list 分页

    /** * * @param list * @param pageNum * @param pageSize * @param <T> * @return 返回当前页数据 */ publi ...

  10. POJ 2528 Mayor's posters 贴海报 线段树 区间更新

    注意离散化!!!线段树的叶子结点代表的是一段!!! 给出下面两个简单的例子应该能体现普通离散化的缺陷: 1-10 1-4 5-10 1-10 1-4 6-10 普通离散化算出来的结果都会是2,但是第二 ...