创建一个 Django 项目:yanzhengma 和 应用 app01

修改 urls.py 文件

from django.contrib import admin
from django.urls import path from app01 import views urlpatterns = [
path('admin/', admin.site.urls),
path('login/', views.login),
path('get_valid_img.png/', views.get_valid_img),
]

在 templates 文件夹下 创建一个 login.html 文件

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post" action="/login/">
<fieldset>
<p>验证码: <input type="text" name="checkcode" /> <img onclick="ChangeCode();" id="imgCode" src="/get_valid_img.png" title="点击更新" /></p>
<input type="submit">
</fieldset>
</form> <script type="text/javascript">
function ChangeCode() {
var code = document.getElementById('imgCode');
code.src += '?';
}
</script>
</body>
</html>

修改 settings.py 文件,注释下面行

#    'django.middleware.csrf.CsrfViewMiddleware',

修改 views.py 文件

from django.shortcuts import render, HttpResponse, render_to_response
from django.http import JsonResponse
from django.contrib import auth
from PIL import Image, ImageDraw, ImageFont
import io
import random # Create your views here. def login(request):
if request.method == 'POST':
check_code = request.POST.get('checkcode')
session_code = request.session["valid_code"]
if check_code.strip().lower() != session_code.lower():
return HttpResponse('验证码不匹配')
else:
return HttpResponse('验证码正确') return render_to_response('login.html', {'error': ""}) def get_valid_img(request):
# 获取随机颜色的函数
def get_random_color():
return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255) # 生成一个图片对象
img_obj = Image.new(
'RGB', # mode
(220, 35), # size
get_random_color() # color
) # 在生成的图片上写字符
# 生成一个图片画笔对象
draw_obj = ImageDraw.Draw(img_obj) # 加载字体文件,得到一个字体对象
font_obj = ImageFont.truetype("Monaco.ttf", 28)
tmp_list = []
for i in range(5):
u = chr(random.randint(65, 90)) # 生成大写字母
l = chr(random.randint(97, 122)) # 生成小写字母
n = str(random.randint(0, 9)) # 生成数字,要转换成字符串类型 tmp = random.choice([u, l, n])
tmp_list.append(tmp)
# draw.text():文字的绘制,第一个参数指定绘制的起始点(文本的左上角所在位置),第二个参数指定文本内容,第三个参数指定文本的颜色,第四个参数指定字体(通过ImageFont类来定义)。
draw_obj.text((20 + 40 * i, 0), tmp, fill=get_random_color(), font=font_obj) # 保存到 session
request.session["valid_code"] = "".join(tmp_list) # 加干扰线
width = 220 # 图片宽度(防止越界)
height = 35
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():直线的绘制,第一个参数指定的是直线的端点坐标,形式为(x0, y0, x1, y1),第二个参数指定直线的颜色;
draw_obj.line((x1, y1, x2, y2), fill=get_random_color()) # 加干扰点
for i in range(40):
# 在给定的坐标点上画一些点;坐标列表是包含2元组[(x,y),…]或者数字[x,y,…]的任何序列对象;变量options的fill给定点的颜色。
draw_obj.point((random.randint(0, width), random.randint(0, height)), fill=get_random_color())
x = random.randint(0, width)
y = random.randint(0, height)
# draw.arc():(椭)圆弧的绘制,第一个参数指定弧所在椭圆的外切矩形,第二、三两个参数分别是弧的起始和终止角度, 第四个参数是填充颜色,第五个参数是线条颜色;
draw_obj.arc((x, y, x+4, y+4), 0, 90, fill=get_random_color()) # 不需要在硬盘上保存文件,直接在内存中加载就可以
io_obj = io.BytesIO() # 将生成的图片数据保存在io对象中
img_obj.save(io_obj, "png") #从io对象里面取上一步保存的数据
data = io_obj.getvalue() return HttpResponse(data)

生成数据库

python manage.py makemigrations  

python manage.py migrate

Django 简单的验证码的更多相关文章

  1. 学习笔记:利用GDI+生成简单的验证码图片

    学习笔记:利用GDI+生成简单的验证码图片 /// <summary> /// 单击图片时切换图片 /// </summary> /// <param name=&quo ...

  2. ThinkPHP简单的验证码实现

    ThinkPHP简单的验证码实现 写一个最简单的TP验证码. 写Controller 首先在Controller/IndexController.class.php(简称Index)文件中编辑: &l ...

  3. python 简单图像识别--验证码

    python  简单图像识别--验证码 记录下,准备工作安装过程很是麻烦. 首先库:pytesseract,image,tesseract,PIL windows安装PIL,直接exe进行安装更方便( ...

  4. DJango简单的后台定义登录验证

    第一步创建一个新的项目 APPLICATIONNAME : 表示创建子项目 第二步:找到主项目的url 进行 include 分发式url 简单的说,就是将app里边的url放在这里. 这里也可以找到 ...

  5. Flask学习之旅--用 Python + Flask 制作一个简单的验证码系统

    一.写在前面 现在无论大大小小的网站,基本上都会使用验证码,登录的时候要验证,下载的时候要验证,而使用的验证码也从那些简简单单的字符图形验证码“进化”成了需要进行图文识别的验证码.需要拖动滑块的滑动验 ...

  6. Python 常用模块系列学习(1)--random模块常用function总结--简单应用--验证码生成

    random模块--random是一个生成器 首先: import random    #导入模块 print (help(random))    #打印random模块帮助信息 常用function ...

  7. python简单处理验证码,三分钟,不能再多了

    序言 大家好鸭, 又是我小熊猫啦 我们在做采集数据的时候,过快或者访问频繁,或者一访问就给弹出验证码,然后就蚌珠了~今天就给大家来一个简单处理验证码的方法 环境模块 Python和pycharm如果还 ...

  8. django 发送手机验证码

    一.流程分析: 1.用户在项目前端,输入手机号,然后点击[获取验证码],将手机号发到post到后台. 2.后台验证手机号是否合法,是否已被占用,如果通过验证,则生成验证码,并通过运行脚本,让短信运营商 ...

  9. 前端、数据库、Django简单的练习

    一.前端 1.前端页面由哪几层构成,分别是什么,作用是什么? 分为:结构层(html),表示层(css),行为层(js). 结构层 超文本标记语言.由HTML或XHTML之类的标记语言负责创建.标签, ...

随机推荐

  1. spring框架开发包官网各版本的下载地址

    链接地址https://spring.io/tools3/sts/legacy,推荐迅雷下载

  2. 使用 IDEA 翻译插件

    使用 IDEA 翻译插件 1.安装 在IDEA插件中搜索 translation根据下载量排序有个完全匹配名称的插件,下载,重启 2.配置翻译插件 都是中文,就不说了

  3. 快速获取 IP 地址

    IP 地址可以分为两类,公用和私有(专用).公用 IP 是唯一的 IP 地址,可以从 Internet 访问.专用 IP 地址保留供您专用网络内部使用,而不会直接暴露给 Internet. 本文将介绍 ...

  4. js支持装饰器

    vscode中使用装饰器不报错 { "compilerOptions": { "experimentalDecorators": true } } yarn a ...

  5. windows远程工具RDO和RDC使用问题

    一. Remote Desktop Organizer远程连接时报错 解决方法: 二. Remote Desktop Connection Manager远程电脑没有全屏,右边和下边有滚动条 解决方法 ...

  6. SVN 中项目名字全是红色 和 文件夹图标上没标记绿钩解决办法

             没有绿色标记卸载Tortoise 小乌龟重装 ! 红色名字是 原来idea当前的project用了版本控制器, 那么建到这个project下面的所有项目就都是加入到版本控制里面的, ...

  7. P3十进制转换为二进制

    #include<stdio.h>int main ()   {    int n;    scanf("%d",&n);    int a[8];    fo ...

  8. 转载-用excel批量生成insert语句

    用excel批量生成insert语句   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/h ...

  9. vuex源码分析(二) state及strict属性 详解

    state也就是vuex里的值,也即是整个vuex的状态,而strict和state的设置有关,如果设置strict为true,那么不能直接修改state里的值,只能通过mutation来设置 例1: ...

  10. sql server 下载安装标记

    SQL Server 2017 的各版本和支持的功能 https://docs.microsoft.com/zh-cn/sql/sql-server/editions-and-components-o ...