验证码:在用户注册/登陆时使用,为了防止暴力请求,减轻服务器压力,也是防止csrf的一种方式。

运行环境:python django

对应template模块htm函数:

登陆页面:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>验证码</title>
</head>
<body>
<form method="post" action="{% url 'inn:verificationcheck'%}"> <!--反向解析-->
<!--<form method="post" action="/sunck/verificationcheck/"> -->
{% csrf_token %}
<input type="text" name="verification_code"/>
<img src="/sunck/verification_code/">
<input type="submit" value="登陆"/>
<span>{{ flag }}</span> <!--状态码-->
</form>
</body>
</html>

verificationfile.html

登陆成功页面:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登陆成功</title>
</head>
<body>
<h1>登陆成功</h1>
</body>
</html>

success.html

对应url.py配置:

项目级:

from django.contrib import admin
from django.urls import include
from django.conf.urls import url
from my_inn import views
urlpatterns = [
path('admin/', admin.site.urls),
path('sunck/',include('my_inn.urls',namespace='inn')),
# 方便不同的app的管理 # namespace :与url的反向解析有关
]

urls.py

应用级:

 from django.conf.urls import url
from django.urls import path
from . import views
app_name='inn'
urlpatterns = [
url(r'^verification_code/$', views.verification_code),
url(r'verificationfile/$',views.verificationfile),
url(r'verificationcheck/$', views.verificationcheck,name='verificationcheck'),
]

urls.py

对应views.py文件函数:

from django.shortcuts import render,redirect
from PIL import Image, ImageDraw, ImageFont # 引入绘图模块
import random # 引入随机函数模块
from django.http import HttpResponse
from io import BytesIO # 在内存中创建 # 颜色的填充
def get_random_color():
color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
return color def verification_code(request):
# 1.1 定义变量,宽,高,背景颜色
width = 130
height = 50
background_color = get_random_color()
# 1.2 创建画布对象
image = Image.new('RGB', (width, height), background_color)
# 1.3 创建画笔对象
draw = ImageDraw.Draw(image)
# 1.4 调用画笔的point()函数绘制噪点
for i in range(0, 100):
xy = (random.randrange(0, width), random.randrange(0, height)) # 在尺寸内画点
draw.point(xy, fill=get_random_color())
# 1.5 调用画笔的line()函数制造线
for i in range(0, 5):
xy_start = (random.randrange(0, width), random.randrange(0, height))
xy_end = (random.randrange(0, width), random.randrange(0, height))
draw.line((xy_start, xy_end), fill=get_random_color()) # 2 用draw.text书写文字
rand_python = ''
# 随机选取4个值作为验证码
for i in range(4):
random_number = str(random.randint(0, 9)) # 数字0-9
random_lower_letter = chr(random.randint(97, 122)) # 字母a-z
random_upper_letter = chr(random.randint(65, 90)) # 字母A-Z
rand_python += random.choice([random_number, random_lower_letter, random_upper_letter,])
color = get_random_color() # 构造字体颜色
text_color = [0, 0, 0]
#
for j in range(2):
if color[j]-background_color[j] <= 30:
text_color[j] = 255-color[j]
else:
text_color[j] = color[j]
# 验证码字体及颜色
draw.text((i * (width/4) + 10, 2),
rand_python[i],
tuple(text_color),
font=ImageFont.truetype(r'C:\Windows\Fonts\CHILLER.TTF', 40),
align='center') # 3 释放画笔
del draw
# 存入session,用于做进一步的验证
request.session['verification_code'] = rand_python
# 内存文件操作
buf = BytesIO()
# 将图片保存在内存中,文件类型为png
image.save(buf, 'png')
# 将内存中的图片数据返回给客户端,MIME类型为图片png
return HttpResponse(buf.getvalue(), 'image/png') def verificationfile(request):
rflag = request.session.get("flag",True)
str = ""
if rflag ==False:
str = "请重新输入"
request.session.clear()
return render(request,'myMain/verificationfile.html',{"flag":str}) def verificationcheck(request):
# 把接收到的验证码拿进来对比session中存储的验证码
code1 = request.POST.get("verification_code").upper() # 不区分大小写
code2 = request.session['verification_code'].upper()
if code1 == code2:
# 成功跳转页面
return render(request,'myMain/success.html')
else:
# 不成功重定向
request.session["flag"] = False
return redirect('/sunck/verificationfile/')

view.py代码转自:https://blog.csdn.net/weixin_43830248/article/details/86670064

python_django__验证码的更多相关文章

  1. .net点选验证码实现思路分享

    哈哈好久没冒泡了,最进看见点选验证码有点意思,所以想自己写一个. 先上效果图 如果你被这个效果吸引了就请继续看下去. 贴代码前先说点思路: 1.要有一个汉字库,并按字形分类.(我在数据库里是安部首分类 ...

  2. 【探索】无形验证码 —— PoW 算力验证

    先来思考一个问题:如何写一个能消耗对方时间的程序? 消耗时间还不简单,休眠一下就可以了: Sleep(1000) 这确实消耗了时间,但并没有消耗 CPU.如果对方开了变速齿轮,这瞬间就能完成. 不过要 ...

  3. TODO:Laravel增加验证码

    TODO:Laravel增加验证码1. 先聊聊验证码是什么,有什么作用?验证码(CAPTCHA)是"Completely Automated Public Turing test to te ...

  4. PHP-解析验证码类--学习笔记

    1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1  定义变量 //随机因子 private $char ...

  5. 随手记_C#验证码

    前言 最近在网上偶然看见一个验证码,觉得很有意思,于是搜了下,是使用第三方实现的,先看效果: 总体来说效果还是可以的,官方提供的SDK也比较详细,可配置性很高.在这里在简单啰嗦几句使用方式: 使用步骤 ...

  6. WPF做12306验证码点击效果

    一.效果 和12306是一样的,运行一张图上点击多个位置,横线以上和左边框还有有边框位置不允许点击,点击按钮输出坐标集合,也就是12306登陆的时候,需要向后台传递的参数. 二.实现思路 1.获取验证 ...

  7. 零OCR基础6行代码实现C#验证码识别

    这两天因为工作需要,要到某个网站采集信息,一是要模拟登陆,二是要破解验证码,本想用第三方付费打码,但是想想网上免费的代码也挺多的,于是乎准备从网上撸点代码下来,谁知道,撸了好多个都不行,本人以前也没接 ...

  8. ASP.NET中画图形验证码

    context.Response.ContentType = "image/jpeg"; //生成随机的中文验证码 string yzm = "人口手大小多少上中下男女天 ...

  9. asp.net mvc 验证码

    效果图 验证码类 namespace QJW.VerifyCode { //用法: //public FileContentResult CreateValidate() //{ // Validat ...

随机推荐

  1. ollvm 编译

    ollvm 的编译相对 llvm 更简单, 1:下载ollvm代码,去 https://github.com/obfuscator-llvm/obfuscator/tree/llvm-4.0 下载,并 ...

  2. Python之在字符串中处理html和xml

    需求:替换文本字符串中的 ‘<’ 或者 ‘>’ ,使用 html.escape() 函数 import html s="<div>你好<div>" ...

  3. springmvc Cacheable (RedisTemplate / StringRedisTemplate)

    直接使用spring缓存请见:https://www.cnblogs.com/hanjun0612/p/11661340.html RedisTemplate和StringRedisTemplate配 ...

  4. C# Copy一个文件到另一个文件夹下

    public static void CopyToFile() { //源文件路径 string sourceName = @"D:\Source\Test.txt"; //目标路 ...

  5. oracle入门学习之oracle数据库结构

    1. oracle数据库结构 1.1 Oracle可以看做是一个大的数据库???,里面可以创建很多实例; 一个实例对应多个表空间.多个用户; 一个用户只能有一个表空间; 一个表空间可以有多个用户; 一 ...

  6. C++中创建对象的时候加括号和不加括号的区别(转)

    c++创建对象的语法有----- 1 在栈上创建 MyClass a; 2 在堆上创建加括号 MyClass *a= new MyClass(); 3 不加括号 MyClass *a = new My ...

  7. Java刷题笔记

    能用StringBuffer的时候坚决不要用String,因为前者的时间和空间效率都更高. 牛顿法求平方根:随便找一个K,然后不断让 k=(k+x/k)/2;直到K的平方与x之间的差距小于限定值. 斐 ...

  8. idea创建Maven项目后启动报404

    这块的配置是

  9. 一文带你了解 Flink Forward 柏林站全部重点内容

    前言 2019.10.7~9号,随着70周年国庆活动的顺利闭幕,Flink Forward 也照例在他们的发源地柏林举办了第五届大会.虽然还没有拿到具体的数据,不过从培训门票已经在会前销售一空的这样的 ...

  10. 【LeetCode 24】两两交换链表中的节点

    题目链接 [题解] 简单的链表操作 [代码] /** * Definition for singly-linked list. * struct ListNode { * int val; * Lis ...