python验证码图片生成
环境: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验证码图片生成的更多相关文章
- 验证码图片生成工具类——Captcha.java
验证码图片生成工具,使用JAVA生成的图片验证码,调用getRandcode方法获取图片验证码,以流的方式传输到前端页面. 源码如下:(点击下载 Captcha.java) import java. ...
- .Net中验证码图片生成
开发网站或平台系统,登录页面是必不可少的功能,但是现在很多人可以使用工具暴力破解网站密码,为了防止这类非法操作,需要在登录页面添加验证,验证码就是最常用的一种验证方式. 我结合了自己的经验和网上的验证 ...
- asp.net验证码图片生成示例
验证码,一个很常见的东西.不管你是使用者还是开发者,这个东西80%的人都见到过,但是之前有人给我说过这么一句话“内行看门道,外行看热闹!”,仔细琢磨一下还真的是那么一回事.对于怎么实现验证码,闲话不多 ...
- c# 验证码图片生成类
using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D ...
- mvc验证码图片生成
/// <summary> ///生成验证码 /// </summary> public class VerifyCode { /// <summary> /// ...
- django 验证码图片生成视图函数
def verify_code(request): import random # 定义验证码图片背景颜色 宽和高 bgcolor = (random.randrange(20,180),random ...
- 通过python将图片生成字符画
基础知识: 1.python基础知识 快速学习链接:https://www.shiyanlou.com/courses/214 2.linux命令行操作 快速学习链接:https://www. ...
- python识别图片生成字符模式
此python文件来自D7哥, 放在这里备份. 用法 python3 PIL\&argparse.py 1.jpg -o test.txt --width 300 --height 300 p ...
- python imageio 图片生成gif
#!/bin/python3 import matplotlib.pyplot as plt import imageio,os TIME_GAP=0.075 #两帧之间的时间间隔,秒为单位 FILE ...
随机推荐
- Netty 面试题 (史上最全、持续更新)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- Mybatis数据连接池的配置---增删改查(以及遇见的问题)
1.首先创建项目和各个文件,如图所示: 2.配置相关数据库连接 在jdbc.properties中加入 1 db.driver=com.mysql.jdbc.Driver 2 db.url=jdbc: ...
- 【Javascript + Vue】实现随机生成迷宫图片
前言 成品预览:https://codesandbox.io/s/maze-vite-15-i7oik?file=/src/maze.js 不久前写了一篇文章介绍了如何解迷宫:https://www. ...
- ES6学习笔记之函数(一)
1.函数的默认参数 在ES6 之前,我们不能直接为函数的参数指定默认值,只能采用其他方法.如: function show (num, callback){ num = num || 6; callb ...
- [HTML]图像标签<img>的用法、属性及路径问题
图像标签:<img> 用法:<img src = "图像地址"> 图像标签的属性 属性 说明 src 指明图像的地址(分为相对路径和绝对路径两 ...
- 对ES6中类class以及实例对象、原型对象、原型链之间关系的详细总结
1. 类 ES6 中新增加了类的概念,可以使用 class 关键字声明一个类,之后用这个类来实例化对象.即类的用途:实例化对象. // 创建一个Person类 class Person { } // ...
- 10、linux启动过程
(1)linux启动说明: 第一步:开机自检,检查硬件,加载BIOS(帮我们找到启动盘是谁): 第二步:读取MBR(读取启动硬盘0柱面0磁道1扇区(512字节)的前446字节,找到装有操作系统的分区) ...
- 界面设计ie8 笔记
1.ie8 jsp中设置 margin:0 auto 无效 解决方法 在html 标签改为<!DOCTYPE html> 2.ie8 input file 无法通过js触发点击事件,网上 ...
- 资源:Navicat15最新版本破解 亲测可用(2020-11-14)
1.下载Navicat Premium 官网https://www.navicat.com.cn/下载最新版本下载安装 2.网盘下载破解 本人网盘链接:https://pan.baidu.com/s/ ...
- Nginx:Nginx日志切割方法
Nginx的日志文件是没有切割(rotate)功能的,但是我们可以写一个脚本来自动切割日志文件. 首先我们要注意两点: 1.切割的日志文件是不重名的,所以需要我们自定义名称,一般就是时间日期做文件名. ...