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聊天程序实例代码分享
Nov 18 Python
介绍Python的Urllib库的一些高级用法
Apr 30 Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
Sep 26 Python
flask + pymysql操作Mysql数据库的实例
Nov 13 Python
Python中的上下文管理器和with语句的使用
Apr 17 Python
python 借助numpy保存数据为csv格式的实现方法
Jul 04 Python
pandas通过loc生成新的列方法
Nov 28 Python
对python 通过ssh访问数据库的实例详解
Feb 19 Python
Python 循环终止语句的三种方法小结
Jun 24 Python
使用python实现ftp的文件读写方法
Jul 02 Python
python实现复制大量文件功能
Aug 31 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
Mar 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批量生成缩略图的代码
2008/07/19 PHP
PHP中文分词 自动获取关键词介绍
2012/11/13 PHP
Smarty分页实现方法完整实例
2016/05/11 PHP
php 截取GBK文档某个位置开始的n个字符方法
2017/03/08 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
2019/10/15 PHP
用JavaScript获取网页中的js、css、Flash等文件
2006/12/20 Javascript
浅谈Javascript事件处理程序的几种方式
2012/06/27 Javascript
JS复制到剪贴板示例代码
2013/10/30 Javascript
showModelDialog弹出文件下载窗口的使用示例
2013/11/19 Javascript
jquery判断至少有一个checkbox被选中的方法
2015/06/05 Javascript
JSON与XML优缺点对比分析
2015/07/17 Javascript
js编写三级联动简单案例
2016/12/21 Javascript
从零学习node.js之mysql数据库的操作(五)
2017/02/24 Javascript
Vue封装一个简单轻量的上传文件组件的示例
2018/03/21 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
2018/12/03 Javascript
详解使用React.memo()来优化函数组件的性能
2019/03/19 Javascript
使用layui前端框架弹出form表单以及提交的示例
2019/10/25 Javascript
vue中get请求如何传递数组参数的方法示例
2019/11/08 Javascript
vue缓存之keep-alive的理解和应用详解
2020/11/02 Javascript
python利用hook技术破解https的实例代码
2013/03/25 Python
Python使用matplotlib简单绘图示例
2018/02/01 Python
python实现linux下抓包并存库功能
2018/07/18 Python
Python引用计数操作示例
2018/08/23 Python
python+logging+yaml实现日志分割
2019/07/22 Python
django写用户登录判定并跳转制定页面的实例
2019/08/21 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
python opencv 实现对图像边缘扩充
2020/01/19 Python
在python里创建一个任务(Task)实例
2020/04/25 Python
大学生优秀自荐信范文
2014/02/25 职场文书
前处理班长职位说明书
2014/03/01 职场文书
全国文明单位申报材料
2014/05/31 职场文书
小学生清明节演讲稿
2014/09/05 职场文书
企业承诺书格式范文
2015/04/28 职场文书
2015年图书馆个人工作总结
2015/05/26 职场文书
开学第一天的感想
2015/08/10 职场文书
Nginx内网单机反向代理的实现
2021/11/07 Servers