@[T
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 学习的时候参考过很多篇他人的博客,本篇博客是我第一篇学习笔记
  • 一、方法一使用步骤
    • 1.下载库
    • 2.setting中的配置
    • 3.迁移同步,生成captcha依赖的表
    • 4.将captcha字段在form类(表单验证限制条件的那个类)中设置,school是我原有的验证
    • 5.在后台views视图中,GET请求里面实例化我们的form表单类,把form表单对象传递到前端页面。
    • 6.在页面上通过{{form 对象.captcha}}获取验证码
  • 方法二
    • 1.写一个生成验证码的类,然后把这一个类保存到需要验证码的APP目录那。反正能导入就行了。
    • 2.在需要验证码的APP中创建一个它的url,和views
    • 3.前端如何引用这个HttpResponse返回?
  • 总结

学习的时候参考过很多篇他人的博客,本篇博客是我第一篇学习笔记

一、方法一使用步骤

1.下载库

pip install django-simple-capcha

2.setting中的配置

添加captcha

3.迁移同步,生成captcha依赖的表

python manage.py makemigrations
python manage.py migrate

4.将captcha字段在form类(表单验证限制条件的那个类)中设置,school是我原有的验证

class loginform(forms.Form):
school = forms.CharField(max_length=10,required=True,error_messages={“requird”:“学校名不能为空”})
captcha = CaptchaField(error_messages={‘invalid’: ‘验证码错误’})

5.在后台views视图中,GET请求里面实例化我们的form表单类,把form表单对象传递到前端页面。

def add_profession(request):if request.method == 'GET':context = request.contextprojects = ((i, j.summary) for i, j in enumerate(Project.objects.all()))context['projects'] = projects#需要传递项目信息给前端供添加的时候进行选择user_register_form = loginform()return render(request,'add_pro.html',{'user_register_form':user_register_form})else:obj = loginform(request.POST)status = obj.is_valid()#post的数据符合loginform的限制,则返回1,否则不合法返回0print(status)success_dict = obj.clean()print('正确的信息',success_dict)failed_dict = obj.errors#获取obj.clean():获取提交的所有正确数据#obj.errors():获取提交的所有错误信息if not obj.is_valid():print('错误的信息',failed_dict)return render(request,'index.html',{'user_register_form': user_register_form})#会返回表单验证中设置的error_messageelse:#获取表单验证里面数据的方法school = obj.cleaned_data['school']return render(request,'index.html')

6.在页面上通过{{form 对象.captcha}}获取验证码

这时候就已经可以显示验证码了,点击刷新的话,需要添加点击事件。

方法二

1.写一个生成验证码的类,然后把这一个类保存到需要验证码的APP目录那。反正能导入就行了。

from PIL import Image, ImageDraw, ImageFont
import random
#生成验证码图片的类
class CheckCode:def generation_code(self):valid_code = ''for i in range(4):# randint参数要去为整数,且返回其中任一整数string_low = chr(random.randint(97, 122))string_upper = chr(random.randint(65, 90))num = str(random.randint(0, 9))# 上面三个都已经分别随机生成了一个字符,下面这一句是随机三选一code = random.choice([string_low, string_upper, num])valid_code += codereturn valid_code# 生成随机颜色RGBdef get_random_color(self):return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)# 生成图片def generation_img(self):# Image.new()方法,顾名思义,是用来创建一个新的图像,具体参数如下:第一个是模式,第二个是图像大小,第三个是颜色img = Image.new('RGB', (200, 40), color=self.get_random_color())# 创建一个可以在给定图片上绘图的对象,就是说img本来是定个图片,现在允许被修改了draw = ImageDraw.Draw(img)# 加载字体font = ImageFont.truetype('C:/Users/Administrator/PycharmProjects/profession_systems/static/Font/锐字真言体.ttf',size=30)# 加载验证码check_code = self.generation_code()i = 1# 验证码写入图片上for c in check_code:# draw.text的参数,第一个是二元元祖,指定字符串左上角坐标,第二个是要写入的字符串,第三个是字体颜色,第四个是字体样式。draw.text((i * 40, 4), c, self.get_random_color(), font=font)i = i + 1# 设置图片宽高width = 200height = 40# 写干扰点40个for i in range(40):# 坐标随机,fill是填充色draw.point([random.randint(0, width), random.randint(0, height)], fill=self.get_random_color())# 画线干扰5条,参数上同for i in range(5):x1 = random.randint(0, width)x2 = random.randint(0, width)y1 = random.randint(0, height)y2 = random.randint(0, height)draw.line((x1, y1, x2, y2), fill=self.get_random_color())# 写干扰圆圈5个for i in range(5):draw.point([random.randint(0, width), random.randint(0, height)], fill=self.get_random_color())x = random.randint(0, width)y = random.randint(0, height)# 画弧,分别是左上角和右下角两个点的坐标,开始角度和结束角度,fill颜色draw.arc((x, y, x + 4, y + 4), 0, 90, fill=self.get_random_color())return img, check_code这一坨是测试代码
'''a=CheckCode()
img, check_code=a.generation_img()
print(img, check_code)
print(img.format) #这个属性标识了图像来源,如果图像不是从文件读取它的值就是None。
img.show()
im = Image.open('./share')
im.show()'''

2.在需要验证码的APP中创建一个它的url,和views


3.前端如何引用这个HttpResponse返回?

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head><meta charset="UTF-8"><title>专家管理系统</title><link rel="stylesheet" href="/static/css/main.css"><script type="text/javascript" src="/static/js/main.js"></script>
</head>
<body><form action="{% url 'login_index' %}" method="GET">验证码<input type="text" name="codevalue"><br>
{% 关键就是这个src要等于对应HTTPresponse路由地址的返回就好了 %}<br><img src="{% url 'check_code2' %}" id="code" onclick="change()" alt="验证码"><html><h1>test</h1>
{% 这一个是点击就会刷新验证码,src后面对应的是,访问那个HttpResponse的路由地址 %}
<img onclick="this.setAttribute('src','/user/check_code/?nocache='+Math.random());"src="{% url 'check_code2' %}" alt="验证码图片" />
</html><input type="submit" value="submit">
</form><a href="{% url 'login_index' %}">登录</a><a href="{% url 'add_pro' %}">添加专家信息</a><a href="{% url 'alter_del' %}">修改删除专家信息</a><a href="{% url 'profession_user' %}">查看全部专家信息</a><a href="{% url 'forget_password' %}">遗忘了~重置管理员密码</a><a href="{% url 'profession_evaluate' %}">评价专家</a>
</body>
</html>

总结

方法一更为简单,不用自己写生成验证码的类,我是因为先接触了方法二,一直搞不定,才去了解方法一,最后还是气不过,回头又弄一次方法二终于明白了。写给自己当笔记用的,记住验证码的使用方法。

django中验证码图片的两种使用方法相关推荐

  1. word涂改涂掉图片_怎么在word中修改图片的两种方法

    有时我们插入的图片只有一部分是我们想要的,那就需要我们将这一部分裁剪出来,word本身就可以方便快捷的对图片进行裁剪,那么下面就由学习啦小编给大家分享下在word中修改图片的技巧,希望能帮助到您. 在 ...

  2. Word中繁体艺术字的两种制作方法(转)

    Word中繁体艺术字的两种制作方法(转) Word里的艺术字是大家平时常用的一项功能,但有时我们可能需要制作一些繁体艺术字,而这个看似简单的要求,实现起来却不是那么容易,因为Word里的繁简转换功能对 ...

  3. HTML5中aside标签的两种使用方法

    aside元素在网站制作中主要有以下两种使用方法 1)被包含在article元素中作为主要内容的附属信息部分,其中的内容可以是与当前文章有关的相关资料.名次解释,等等. <article> ...

  4. c语言中将十六进制数转换为十进制数程序,C语言中十六进制转十进制两种实现方法...

    C语言中十六进制转十进制两种实现方法 C语言 · 十六进制转十进制 问题描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出. 注:十六进制数中的10~15分别用大写的英 ...

  5. 给TextView设置图片的两种实现方法

    有时在开发过程中,我们会有在TextView中添加图片的需求(比如下图箭头所指文字中的表情).而在xml中对Textview进行属性设置时,只能设置图片在TextView的左.右.上.下四个位置,不能 ...

  6. 在Linux系统中存储设备的两种表示方法

    作者:北南南北 来自:LinuxSir.Org 摘要: 硬盘和硬盘分区在Linux都表示为设备,按我们通俗的说法来说,就是怎么来表示或描述硬盘和或硬盘分区,但这种描述应该是科学和具体的:比如IDE硬盘 ...

  7. android camera工程师,Android从Camera中获取图片的两种方法

    方法一: 此方法会由Camera直接产生照片回传给应用程序,但是返回的是压缩图片,显示不清晰 /**   启动Camera */ private void intentCamera(){ try { ...

  8. cad添加自己线性_CAD中自定义线型的两种设置方法

    我们在进行装修深化或水电施工图的过程中,经常会用到一些特殊的线型来表示不同的线路,CAD中自带的线型远无法满足我们的需求,其实在CAD中可以自己动手绘制中间插入文字或是其它各类的线型,做好后打包,用的 ...

  9. hive中case when的两种使用方法

    如下两种的表达效果是一样 方法一: select tm , count(tm) as times from ( select case when single_times = '1' then 'on ...

最新文章

  1. 别再乱打日志了,这样才是定位 bug 打日志的方式!
  2. 如何安装Android SDK Emulator
  3. 【Python】正则表达式使用、常用匹配表达式
  4. LeetCode 869. 重新排序得到 2 的幂(排序 全排列)
  5. 均值已知检验方差_方差分析
  6. 基于ActiveMQ的Topic的数据同步——初步实现
  7. nlp-tutorial代码注释3-2,LSTM简介
  8. 1月3日 接触ROS
  9. java 写文件缓存_使用java NIO及高速缓冲区写入文件过程解析
  10. cad刷新快捷键_掌握了这些实用的CAD技巧,比别人出图快一小时不止
  11. 数据结构——线段树学习笔记
  12. SpringCloud从零构建(三)——创建消费者Customer
  13. 正定与半正定矩阵,判别的方法不能混用,否则出错
  14. 解读:小比尔 · 福特认为特斯拉的成功并非因为马斯克
  15. 笔记1-2020-07-30
  16. 如何利用XGen制作头发,发片-笔记
  17. java解析xml文件并写入Excel表
  18. FMDB-FMDatabaseQueue
  19. SQL Server Express下載地址
  20. 蓝队自检工具 -- WindowsVulnScan

热门文章

  1. C# 文件相关---新建文件、文件另存为、读写文件
  2. 阿里云部署启动java项目全过程(jar包war包)
  3. STM32——SPI驱动SD卡
  4. 【程序员如何买股票 一】 股票基础知识
  5. 实验报告模版Markdown格式 (2)
  6. 用余弦定理求三角形内角
  7. [转载]TMS320F2812引脚详细分析(转帖整理)
  8. 计算机空间密铺,哪些正多面体能够密铺一个空间?
  9. 【英语】新走遍美国-即使平凡也要追求梦想
  10. Lesson3:函数