如何制作验证码

推导步骤1:在img标签的src属性里放上验证码的请求路径

补充1.img的src属性:
	1.图片路径
	2.url
	3.图片的二进制数据
补充2:字体样式
	我们计算机上之所以可以输出各种各样的字体样式,其内部其实对应的是一个个以.ttf结尾的文件
	
由于img的src属性里可以放图片的二进制数据,因此我们可以在src里放上图片的请求路径,返回的是一个图片的二进制数据

<img src="/get_code/" alt="" width="350" height="35">

# 该视图函数返回的是图片的二进制数据,图片是本地已有的图片路径
def get_code(request):
    with open ('static/img/default.png','rb') as f:
        data = f.read()
    return HttpResponse(data)

字体样式网站

推导步骤2:利用pillow模块动态产生图片

"""
图片相关的模块:
        pip3 install pillow
导入:from PIL import Image,ImageDraw,ImageFont
Image:生成图片
ImageDraw:能够在图片上乱涂乱画
ImageFont:控制字体样式
"""
from PIL import Image,ImageDraw,ImageFont
import random

def get_random():
    return random.randint(0,255),random.randint(0,255),random.randint(0,255),

def get_code(request):
    1.先产生一个图片,new方法的第一个参数是固定模式RGB格式,第二个是图片大小(宽,高),第三个是图片颜色(可以放rgb模式的颜色)
    # image_obj = Image.new('RGB',(350,35),'green') # 固定颜色
    # image_obj = Image.new('RGB',(350,35),(23,43,53)) # 变形1
    image_obj = Image.new('RGB', (350, 35), get_random()) # 变形2
    2.将产生的图片存起来,打开一个文件,该图片有一个save方法可以存储图片,第一个参数是文件句柄,第二个是存储图片格式
    with open('xxx.png','wb') as f:
        image_obj.save(f,'png')

    3.再将图片以二进制形式读出来,返回给img标签的src属性
    with open('xxx.png','rb') as f:
        data = f.read()
    return HttpResponse(data)

上述方法:会进行频繁的文件存储IO操作,效率比较低下,步骤4利用内存管理器模块优化!

推导步骤4:利用内存管理器模块优化

"""
导入内存管理器模块:from io import BytesIO,StringIO
BytesIO:功能临时帮您存储数据,返回的数据是二进制
StringIO:功能临时帮您存储数据,返回的数据是字符串
"""
def get_code(request):

    # 1.同样先生成一个图片对象
    image_obj = Image.new('RGB', (350, 35), get_random())
    # 2.这里再生成一个内存管理器对象,就可以看成是f文件句柄
    io_obj = BytesIO()
    # 3.将图片保存到文件管理器对象里
    image_obj.save(io_obj,'png')
    # 4.把图片从文件管理器对象里取出来,用getvalue()方法
    return HttpResponse(io_obj.getvalue())

最终步骤:写图片验证码

def get_code(request):
    # 1.同样先生成一个图片对象
    image_obj = Image.new('RGB', (350, 35), get_random())
    # 2.在图片上生成一个画笔对象
    img_draw = ImageDraw.Draw(image_obj)
    # 3.设置字体样式,truetype()第一个参数是字体样式路径,第二个是字体大小
    img_font = ImageFont.truetype('static/font/222.ttf',30)

    # 4.随机生成验证码,五位,大小写字母、数字
    code = ''
    for i in range(5):
        random_upper = chr(random.randint(65,90)) # 65-90的数字使用chr()函数对应转成大写字母
        random_lower = chr(random.randint(97,122)) # 97-122的数字使用chr()函数对应转成小写字母
        random_int = str(random.randint(0,9))

        # 从上面三种随机选择一种
        tmp = random.choice([random_int,random_lower,random_upper])
        # 将产生的随机字符串写到图片上
        """
        text()方法的第一个参数,字符串在图片上的坐标,第二个是字符串,
        第三个字符串的颜色,第四个字体样式和大小
        """
        img_draw.text((i*60,0),tmp,get_random(),img_font)
        code += tmp
    print(code)
    # 5.将生成的随机验证码保存起来,因为在登录的视图函数需要用到,进行比对
    request.session['code'] = code
    # 6.再生成一个内存管理器对象,就可以看成是f文件句柄
    io_obj = BytesIO()
    # 7.将图片保存到文件管理器对象里
    image_obj.save(io_obj,'png')
    # 8.把图片从文件管理器对象里取出来,用getvalue()方法
    return HttpResponse(io_obj.getvalue())

补充

如何让用户一点验证码图片就刷新验证码

<img src="/get_code/" alt="" width="350" height="35" id="img">


<script>
    $('#img').click(function (){
        let OldUrl = $(this).attr('src')
        $(this).attr('src',OldUrl += '?')
    })
</script>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何制作验证码 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • 面向对象介绍

    1.什么是面向对象和面向过程编程思想 面向过程: 1.核心是‘过程’二字2.过程的含义是将程序流程化3.过程是流水线,用来分步骤解决问题的 程序=数据+功能 面向对象: 1.核心是‘对象’二字2.对象的含义是将程序进行整合3.对象是‘容器’,用来盛放数据和功能(变量和函数) 总结:以做西红柿鸡蛋面为例: 面向过程:我需要买西红柿–》买鸡蛋、面–》把西红柿…

    2023年4月2日
    00
  • 登录功能

    思路分析 登录页面,我们还是采用ajax的方式提交用户数据 唯一需要学习的是如何制作图片验证码! 具体的登录页面效果图如下: 如何制作图片验证码 推导步骤1:在img标签的src属性里放上验证码的请求路径 补充1.img的src属性: 1.图片路径 2.url 3.图片的二进制数据 补充2:字体样式 我们计算机上之所以可以输出各种各样的字体样式,其内部其实对…

    2023年4月2日
    00
  • 关于编辑器和解释型编译型语言

    各种语言用到的编辑器 python开发:pycharm(收费),vscode(免费),sublintext, go开发:goland(收费),vscode,国产的 java:idea(收费),eclipse(免费),MyEclipse(收费) android:androidstudio(免费),eclipse+adt 前端:webstorm(收费) php:…

    Python开发 2023年4月2日
    00
  • 注册功能页面的搭建

    思路分析 注册页面需要对用户提交的数据进行校验,并且需要对用户输入错误的地方进行提示! 所有我们需要使用forms组件搭建注册页面! 平时我们书写form是组件的时候是在views.py里面书写的,但是为了接耦合,我们需要将forms组件都单独写在一个地方,需要用的时候导入就行! 例如,在项目文件夹下创建一个myforms文件夹,里面放各种forms组件文件…

    2023年4月2日
    00
  • python基础(待补充)

    第一篇:计算机的基础知识 编程语言的介绍    计算机介绍和五大组成 平台与软件跨平台介绍 CS、BS架构和网络通信协议 操作系统的介绍 cpu详解 存储器详解 操作系统启动流程和BIOS介绍 关于编辑器和解释型编译型语言 第二篇:python环境的搭建 python介绍和解释器的安装(暂略) python程序的运行方式和步骤 集成开发环境和虚拟环境介绍 第…

    Python开发 2023年4月2日
    00
  • 文章添加页(富文本编辑器的使用)

    1.文章添加页url开设 2.添加文章页面已经富文本编辑器的使用 富文本编辑器kindeditor只要到官网下载下来,放入static文件夹就行,如何在html的script处添加对应固定代码 {% extends ‘backend/base.html’ %} {% block article %} <h3>添加随笔</h3> &lt…

    2023年4月2日
    00
  • rest_framework认证源码分析

    认证源码分析 位置 : APIVIew—-》dispatch方法—》self.initial(request, *args, **kwargs)—->有认证,权限,频率三个版块 分析: 只读认证源码: self.perform_authentication(request)—》self.perform_authentication(re…

    2023年4月2日
    00
  • 上线流程

    上线流程 上线前准备 首先将跑在本地版本的项目,上传至远端(gitee、github上) 重新复制一份项目的配置文件,可以命名为pro.py(dev为开发阶段的配置文件,pro为上线的配置文件) 在pro文件内,修改以下配置项: # 将调式模式改为false DEBUG = False # 运行的host地址,正常就是写服务端的ip地址,不知道可以先写* A…

    2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部