Django之验证码的实现,简单快捷的方法

Django之验证码的实现,简单快捷的方法

实现验证码随网页变动即时刷新,实现有期限时间
请确保安装好pillow
直接show code:
0、路由urs.py

from django.urls import path, re_path
from . import views
urlpatterns = [re_path(r'^test/$', views.testpage, name='test'),re_path(r'^captcha/$', views.captcha, name='captcha'),
]

1、定义生成验证码views.py

import os, random, time, string, io
from django.shortcuts import render
from django.http import HttpResponse
from PIL import Image, ImageDraw, ImageFont
#  生成验证码,# 可以直接可以在html中的img引用
def captcha(request):# 定义背景颜色、宽、高bgcolor = (random.randrange(20, 100), random.randrange(20, 100), random.randrange(20, 100))width = 100height = 50# 创建画面对象img = Image.new('RGB', (width, height), bgcolor)# 创建画笔对象draw = ImageDraw.Draw(img)# 调用画笔的point()函数绘制验证码的干扰点for i in range(0, 100):xy = (random.randrange(0, width), random.randrange(0, height))fill = (random.randrange(0, 255), random.randrange(0, 255), 55)draw.point(xy, fill=fill)# 定义验证码的备选值_str = string.digits + string.ascii_letters# 随机取四个值作为验证码rand_codes = ''.join(random.sample(_str, 4))# 定义字体大小size = int(min(width / len(rand_codes), height))# 构造字体对象font = ImageFont.truetype(r'C:\Windows\Fonts\Arial.ttf', size)# 构造字体颜色,四个字颜色不同for i in range(4):fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))draw.text((i * 25, 2), rand_codes[i], font=font, fill=fontcolor)# 释放画笔del draw# # 将验证码缓存入session,后面做进一步验证,注意应该在这里存入的时候变为小写,# 否则验证码过期就变成了空,再进行lower()操作会抛出异常request.session['verify_code'] = rand_codes.lower()# 验证码有效时间60秒request.session.set_expiry(60)print("生成的验证码是:", rand_codes)print("它应该是与session存的验证码一样:", request.session['verify_code'])buf = io.BytesIO()img.save(buf, 'png')# 将内存中的图片数据返回给客户端,MIME类型为png图片return HttpResponse(buf.getvalue(), 'image/png')# 这样也行# return HttpResponse(buf.getvalue(), 'jpg')

关键点在于io.BytesIO()函数和它的getvalue()函数
BytesIO()使用的是Binary I/O(也叫buffered I/O)的方法,它的处理对象必须是字节类对象(bytes-like object),生成的对象是字节(bytes),这个过程不执行解码、编码和换行转换。这种类型的数据流可以用于所有非文本类的的数据(也就是二进制文件或二进制读取的文本,如图片、gif,以二进制读取的.txt,.py,.html等文件)。

而getvalue()返回储存在缓存中对象整个内容的字节

总之只要理解为:BytesIO()直接以二进制方式读取jpg、png、gif等文件并将它存于缓存中,而getvalue()方法则是将它从缓存中取出来,还原成原来的样子显示给我们看。

2、路由导航函数views.py

# 测试页
def testpage(request):verify_msg = ''_captcha_submit = request.POST.get('verify_code').lower()# 注意这里提交的code需要小写,而服务器的code已经小写,# 这样分开做是为了避免当验证码过期了变为空值取不到session抛出异常_captcha_server = request.session.get('verify_code')if _captcha_server == _captcha_submit:return render(request, 'axf/test.html', {"msg": "验证成功"})else:verify_msg = '验证失败'return render(request, 'testapp/test.html', {"msg": verify_msg})

3、模板下的HTML页test.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>测试页面</title>
</head>
<body><form action="/test/" method="post"><img src="/captcha/" alt="验证码"/><div><label><input type="text" name="verify_code" placeholder="请输入图片中验证码"></label><input type="submit" value="验证"/></div></form><a>验证结果:</a><p style="color: red">{{msg}}</p>
</body>
</html>

展示结果:
在这里插入图片描述
验证码设置了60秒过期,如果过了60秒再输入验证码是不会成功的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469610.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5 Django系列之通过list_display展示多对多与外键内容在admin-web界面下

list_display展示多对多关系的内容 表结构关系 表一 class Server(models.Model):asset models.OneToOneField(Asset)created_by_choices ((auto,Auto),(manual,Manual),)created_by models.CharField(choicescreated_by_choices,max_length32,defaultauto) #auto: auto cre…

智慧交通day04-特定目标车辆追踪01:总览概述

项目介绍&#xff1a; 运动目标跟踪一直以来都是一项具有挑战性的工作, 也是研究的热点方向. 现阶段, 随着硬件设施 的不断完善和人工智能技术的快速发展, 运动目标跟踪技术越来越重要. 目标跟踪在现实生活中有很 多应用, 包括交通视频监控、运动员比赛分析、智能人机交互 、跟…

Python3之字典生成器结合lambda实现按key/value排序

Python3之字典生成器结合lambda实现按key/value排序 1、先介绍不常见的字典按value排序&#xff1a; dict1 {"g": 2, "f": 1, "a": 6} print(dict1.values()) d1 sorted(dict1.items(), keylambda d: d[1], reverseTrue) # 按字典values倒…

XCode8 App上传AppStore更新

1.在这个网站中https://itunesconnect.apple.com 点击“我的APP” 选取需要更新的app 2.点击加号 版本或平台&#xff0c;填写对应的更新版本 3.配置Xcode项目 1 》注意 上图的 套装ID 就是项目中的 Bundle Identity 必须要一模一样 并且不能修改 》配置相同的Bundle Identity…

智慧交通day04-特定目标车辆追踪02:Siamese网络+单样本学习

1.Siamese网络 Siamese network就是“连体的神经网络”&#xff0c;神经网络的“连体”是通过共享权值来实现的&#xff0c;如下图所示。共享权值意味着两边的网络权重矩阵一模一样&#xff0c;甚至可以是同一个网络。 如果左右两边不共享权值&#xff0c;而是两个不同的神经网…

学习网站(不断更新)

一个师兄给我的在线可编译的网站: http://www.fenby.com/user/me Linux最新内核代码: http://www.kernel.org/如果是拿来学习研究的 Linux早期版本内核代码(简单易学): http://www.oldlinux.org/index_cn.html LDD3例子这个家伙写得非常不错 http://blog.csdn.net/liuhaoy…

CSS如何实现两个a标签元素的文字一个靠左一个靠右,并且能点击分别不同的链接

CSS如何实现两个a标签元素的文字一个靠左一个靠右&#xff0c;并且能点击分别不同的链接 作为一个非专业前端&#xff0c;有时候开发又必须自己写一些简单的前端&#xff0c;在网上有时候不能及时查找到内容&#xff0c;只能自己尝试&#xff0c;如下是实现两个span中的a标签下…

智慧交通day04-特定目标车辆追踪03:siamese在目标跟踪中的应用-SiamFC(2016)

目标追踪任务是指在一个视频中给出第一帧图像的bbox的位置&#xff0c;在后续的帧中追踪该物体的任务。 目标追踪不同于目标检测的是&#xff1a; 1、需要给出首帧的标定框。 2、只需要给出标定框&#xff0c;后续的搜索范围往往在上一帧图像的附近。 孪生网络是使用深度学习…

word-break|overflow-wrap|word-wrap——CSS英文断句浅析

---恢复内容开始--- word-break|overflow-wrap|word-wrap——CSS英文断句浅析 一 问题引入 今天在再次学习 overflow 属性的时候&#xff0c;查看效果时&#xff0c;看到如下结果&#xff0c;内容在 div 中国换行了&#xff0c;可是两个 P 元素的内容并没有换行&#xff0c;搜索…

linux内核定时器编程

1.linux内核定时器基本结构和函数 1&#xff09;struct timer_list 一个struct timer_list对应了一个定时器。 #include <linux/timer.h> 以下列出常用的接口&#xff1a; struct timer_list{/*....*/unsigned long expires;//定时器服务函数开始执行时间void (*func…

django ModuleNotFoundError: No module named 'tinymce***'

django ModuleNotFoundError: No module named ‘***’ 1、检查对应的模块是否有安装&#xff0c;可以使用pip list查看 没有安装请执行安装 python -m pip install *** (--user)&#xff0c;某些电脑user没有权限需要加上括号中的 2、如果有安装 请检查python的django配置安…

度量时间差和jiffies计数器

HZ 1、内核通过定时器中断来跟踪时间流 2、时钟中断由系统定时硬件以周期性的间隔产生&#xff0c;这个间隔由内核根据HZ的值设定&#xff0c;HZ是一个与体系结构有关的常数&#xff0c;定义在<linux/param.h>或者该 文件包含的某个子平台相关的文件中。 jiffies 1、…

智慧交通day04-特定目标车辆追踪03:siamese在目标跟踪中的应用-SiamRPN(2017)

3.2 SiamRPN(2017) 3.2.1 网络结构 Siam-RPN提出了一种基于RPN的孪生网络结构&#xff0c;由孪生子网络和RPN网络组成&#xff0c;前者用来提取特征&#xff0c;后者用来产生候选区域。其中&#xff0c;RPN子网络由两个分支组成&#xff0c;一个是用来区分目标和背景的分类分…

点绛唇-王禹偁

diǎn jinɡ chn ɡǎn xnɡ 点 绛 唇 感 兴 wnɡ yǔ chēnɡ 王 禹 偁 yǔ hn yn chu &#xff0c; jiānɡ nn yī ji chēnɡ jiā l 。 雨 恨 云 愁 &#xff0c; 江 南 依 旧 称 佳 丽 。 shuǐ cūn y sh &#xff0c; y lǚ ɡū yān x…

ubuntu 18 Cannot find installed version of python-django or python3-django.

ubuntu系统下安装了django&#xff0c;但是启动django项目时报错 Cannot find installed version of python-django or python3-django. 原因&#xff1a; ubuntu大于14版本的应该安装python3-django 解决办法&#xff1a; apt-get install python3-django 如果提示你有几个…

智慧交通day04-特定目标车辆追踪03:siamese在目标跟踪中的应用-DaSiamRPN(2018)

DaSiamRPN网络的全称为Distractor-aware SiamRPN&#xff0c;是基于SiamRPN网络结构&#xff0c;提出更好的使用数据&#xff0c;针对跟踪过程的干扰物&#xff0c;利用更好的训练方式是跟踪更加的鲁棒。 DaSiamRPN认识到了现有的目标追踪数据集中存在的不平衡问题&#xff0c…

SyntaxError: Non-ASCII character '\xe9' in file...ubuntu系统下python运行时提示编码格式不正确以及提示No module named xxx

在Ubuntu 18下创建django项目&#xff0c;运行python文件时报错&#xff1a; SyntaxError: Non-ASCII character \xe9 in file /home/image/桌面/django_test/test_proj/ test_proj/settings.py on line 127, but no encoding deared; see http://python.org/dev/ peps/pep-02…

智慧交通day04-特定目标车辆追踪03:siamese在目标跟踪中的应用-SiamRPN++(2019)

3.4.1 模型结构 SiamRPN网络结构如下图所示&#xff0c;虚线的两边都是网络结构图&#xff0c;虚线左侧是特征提取网络结构&#xff0c;右侧是RPN结构图。其实SiamRPN的网络结构与SiamRPN网络结构十分相似&#xff0c;而SiamRPN就是在SiamRPN的基础上加入许多的创新点。 SiamR…

lanmp之二 (奇葩问题)

ps&#xff1a;该篇是接 lanmp —— 动静分离 lanmp —— 奇葩问题 话说&#xff0c;在 搭建 bbs.abc.com &#xff08;discuz论坛&#xff09;的 时候。。。。 1、说明&#xff1a;web机器上以前已经有一个 discuz 旧论坛 要做数据迁移&#xff08;改域名/拷贝数据/迁移网站&a…

[已解决]user is not in the sudoers file. This incident will be reported.(简单不容易出错的方式)

linux Ubuntu中报错&#xff0c;XXX is not in the sudoers file. This incident will be reported. 今天在学习的时候&#xff0c;不小心把自己的用户sudo玩坏了&#xff08;Broken sudo&#xff09;&#xff0c;于是上谷歌搜索XXX is not in the sudoers file. This inciden…