django项目登录中使用图片验证码的实现方法


Posted in Python onAugust 15, 2019

应用下创建untils文件夹放置封装图片验证码的函数

创建validCode.py文件定义验证码规则

import random
def get_random_color():
    return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
def get_valid_code_img(request):
  # 方式:
  from PIL import Image, ImageDraw, ImageFont
  from io import BytesIO
  import random
  img = Image.new("RGB", (270, 40), color=get_random_color())#生成一个宽270*高40的画布,背景颜色随机
  draw = ImageDraw.Draw(img)#进行绘画
  kumo_font = ImageFont.truetype("static/font/kumo.ttf", size=32)#字体 字体大小
  valid_code_str = ""
  for i in range(5):
    random_num = str(random.randint(0, 9))#0-9的随机数 9
    random_low_alpha = chr(random.randint(97, 122))#a 到 z 随机的一个小写字母 b
    random_upper_alpha = chr(random.randint(65, 90))#A 到 Z 随机的一个大写字母 Q
    random_char = random.choice([random_num, random_low_alpha, random_upper_alpha])    #2
    draw.text((i * 50 + 20, 5), random_char, get_random_color(), font=kumo_font) #往长方形上写字
    # 保存验证码字符串
    valid_code_str += random_char #85656
  width=270
  height=40
  for i in range(10):
    # draw.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((x, y, x + 4, y + 4), 0, 90, fill=get_random_color()) #小线段
  request.session["valid_code_str"] = valid_code_str
  f = BytesIO()
  img.save(f, "png") #png
  data = f.getvalue()
  return data

建路由

# 登录
path('login/', login.login,name='login'),
# 图片验证码
re_path('get_valid_code_img/', login.get_valid_code_img, name='get_valid_code_img'),

写后台方法

from blog.utils import validCode # 引入自定义的验证码
#页面返回方法
from django.shortcuts import render, HttpResponse, redirect
#哈希加密
from django.contrib.auth.hashers import make_password, check_password
#数据库
from blog.models import Article, Comment, Member, Praise, Web, Image
# 登陆
def login(request):
  res = {'status': None, 'info': None}
  if request.method == 'POST':
    valid_code = request.POST.get("valid_code")
    valid_code_str = request.session.get("valid_code_str")
    print(valid_code, valid_code_str)
    if valid_code.upper() == valid_code_str.upper():
      # 查询用户和密码是否正确
      username = request.POST.get('username')
      pwd = request.POST.get('pwd')
      username_obj = Member.objects.filter(member_name=username).first()
      if not username_obj:
        res['status'] = 3
        res['info'] = '用户名不存在'
        return HttpResponse(json.dumps(res))
      if check_password(pwd, username_obj.member_pwd):
        res['status'] = 1
        res['info'] = '登录成功'
        request.session['member_name'] = username
        request.session['member_id'] = Member.objects.filter(member_name=username).first().member_id
        response_new = HttpResponse(json.dumps(res)) # 把这个结果告诉给前台,ajax
        return response_new
      else:
        res['status'] = 0
        res['info'] = '帐号/密码错误'
        return HttpResponse(json.dumps(res))
    else:
      res['status'] = 2
      res['info'] = '验证码错误'
      return HttpResponse(json.dumps(res))
  return render(request, 'blog/login.html', locals())
  # 生成图片验证码
def get_valid_code_img(request):
  img_data = validCode.get_valid_code_img(request)
  return HttpResponse(img_data)

前端登录的表单

{#登陆的表单#}
<form action="{% url 'blog:login' %}" method="post" id="login">
  <input type="text" class="name" name="username" Placeholder="Username" required=""/>
  <input type="password" class="password" name="pwd" Placeholder="Password" required=""/>
  {% csrf_token %}
  <input type="text" name="valid_code" placeholder="验证码">
  <img width="270" height="36" id="valid_code_img" src="/blog/get_valid_code_img/" alt=""
     onclick="this.src='/blog/get_valid_code_img/?'+Math.random()">
  <div class="login-agileits-bottom">
    <h6><a href="javascript:;" type="button" id="onsubmit">登陆</a></h6>
  </div>
</form>
{#登陆的表单结束#}

前端提交登录表单的jquery

{# 登陆的jquery #}
$(document).ready(function () {
  $('#onsubmit').click(function () {
    $.post('/blog/login/', $('#login').serialize(), function (data) {
      if (data['status'] == 1) {
        layer.msg(data.info);
        location.href = "{% url 'index' %}";
      } else {
        layer.msg(data['info'])
      }
    }, 'json')
  })
})
{# 登陆的jquery结束 #}

页面效果

django项目登录中使用图片验证码的实现方法

总结

以上所述是小编给大家介绍的django项目登录中使用图片验证码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python获取糗百图片代码实例
Dec 18 Python
python 专题九 Mysql数据库编程基础知识
Mar 16 Python
Python、PyCharm安装及使用方法(Mac版)详解
Apr 28 Python
基于Python的XSS测试工具XSStrike使用方法
Jul 29 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
Oct 21 Python
python读取各种文件数据方法解析
Dec 29 Python
Python占用的内存优化教程
Jul 28 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
Jun 14 Python
python 字符串的驻留机制及优缺点
Jun 19 Python
浅谈TensorFlow中读取图像数据的三种方式
Jun 30 Python
python查询MySQL将数据写入Excel
Oct 29 Python
基于Python组装jmx并调用JMeter实现压力测试
Nov 03 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
Aug 15 #Python
解析python的局部变量和全局变量
Aug 15 #Python
python实现的自动发送消息功能详解
Aug 15 #Python
python调用支付宝支付接口流程
Aug 15 #Python
Python使用字典实现的简单记事本功能示例
Aug 15 #Python
Flask框架学习笔记之模板操作实例详解
Aug 15 #Python
Flask框架学习笔记之消息提示与异常处理操作详解
Aug 15 #Python
You might like
php短域名转换为实际域名函数
2011/01/17 PHP
php addslashes 利用递归实现使用反斜线引用字符串
2013/08/05 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
Laravel框架在本地虚拟机快速安装的方法详解
2018/06/11 PHP
Centos7 Yum安装PHP7.2流程教程详解
2019/07/02 PHP
让JavaScript 轻松支持函数重载 (Part 1 - 设计)
2009/08/04 Javascript
JQuery 网站换肤功能实现代码
2009/11/02 Javascript
Extjs4 消息框去掉关闭按钮(类似Ext.Msg.alert)
2013/04/02 Javascript
图解Sublime Text3使用技巧
2015/12/21 Javascript
jQuery实现的文字hover颜色渐变效果实例
2016/02/20 Javascript
js表单元素checked、radio被选中的几种方法(详解)
2016/08/22 Javascript
微信小程序-详解数据缓存
2016/11/24 Javascript
vue.js实现表格合并示例代码
2016/11/30 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
微信小程序实现给循环列表添加点击样式实例
2017/04/26 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
解决layui追加或者动态修改的表单元素“没效果”的问题
2019/09/18 Javascript
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
2020/06/02 Javascript
Vue+Openlayers自定义轨迹动画
2020/09/24 Javascript
Python实例分享:快速查找出被挂马的文件
2014/06/08 Python
python遍历 truple list dictionary的几种方法总结
2016/09/11 Python
Linux CentOS Python开发环境搭建教程
2018/11/28 Python
Python时间序列处理之ARIMA模型的使用讲解
2019/04/02 Python
python自动保存百度盘资源到百度盘中的实例代码
2019/08/26 Python
使用sklearn对多分类的每个类别进行指标评价操作
2020/06/11 Python
美国办公用品折扣网站:Shoplet.com
2019/11/24 全球购物
怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返回 指向字符的指针的函数的指针的数组?
2013/03/19 面试题
Jdbc数据访问技术面试题
2012/03/30 面试题
ktv总经理岗位职责
2014/02/17 职场文书
2014财务人员自我评价范文
2014/09/21 职场文书
2014年干部培训工作总结
2014/12/17 职场文书
会议通知格式范文
2015/04/15 职场文书
学校2016年九九重阳节活动总结
2016/04/01 职场文书
Win11安全功能升级:内置防网络钓鱼功能
2022/04/08 数码科技