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中的一些类型转换函数小结
Feb 10 Python
浅析Python中yield关键词的作用与用法
Nov 29 Python
windows10下python3.5 pip3安装图文教程
Apr 02 Python
Django 实现购物车功能的示例代码
Oct 08 Python
python print出共轭复数的方法详解
Jun 25 Python
Python 类的私有属性和私有方法实例分析
Sep 29 Python
pytorch 图像预处理之减去均值,除以方差的实例
Jan 02 Python
Python 实现将数组/矩阵转换成Image类
Jan 09 Python
Python多进程multiprocessing、进程池用法实例分析
Mar 24 Python
python 在sql语句中使用%s,%d,%f说明
Jun 06 Python
Python-typing: 类型标注与支持 Any类型详解
May 10 Python
Python使用MapReduce进行简单的销售统计
Apr 22 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
Windows下PHP开发环境搭建教程(Apache+PHP+MySQL)
2016/06/13 PHP
PHP手机号中间四位用星号*代替显示的实例
2017/06/02 PHP
YII框架http缓存操作示例
2019/04/29 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
PHP const定义常量及global定义全局常量实例解析
2020/05/28 PHP
详解阿里云视频直播PHP-SDK接入教程
2020/07/09 PHP
javascript iframe中打开文件,并检测iframe存在否
2008/12/28 Javascript
JS实现随机化快速排序的实例代码
2013/08/01 Javascript
利用jq让你的div居中的好方法分享
2013/11/21 Javascript
Node.js实现在目录中查找某个字符串及所在文件
2014/09/03 Javascript
BootStrap实现树形目录组件代码详解
2016/06/21 Javascript
Javascript将双字节字符转换成单字节字符并计算长度
2016/06/22 Javascript
Google 地图类型详解及示例代码
2016/08/06 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
2016/09/20 Javascript
JavaScript 中 avalon绑定属性总结
2016/10/19 Javascript
利用vue实现模态框组件
2016/12/19 Javascript
js模糊查询实例分享
2016/12/26 Javascript
js实现九宫格拼图小游戏
2017/02/13 Javascript
jQuery实现可编辑表格并生成json结果(实例代码)
2017/07/19 jQuery
JavaScript 中的12种循环遍历方法【总结】
2018/05/31 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
基于JS实现table导出Excel并保留样式
2020/05/19 Javascript
对于Python的Django框架部署的一些建议
2015/04/09 Python
详解Python字符串对象的实现
2015/12/24 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
2016/06/27 Python
Python编写一个闹钟功能
2017/07/11 Python
Python3实现带附件的定时发送邮件功能
2020/12/22 Python
linux环境下安装python虚拟环境及注意事项
2020/01/07 Python
基于canvas使用贝塞尔曲线平滑拟合折线段的方法
2018/01/10 HTML / CSS
真正的英国宝藏:Mappin & Webb
2019/05/05 全球购物
会计助理的岗位职责
2013/11/29 职场文书
外贸员简历中的自我评价
2014/03/04 职场文书
药剂专业自荐书
2014/06/20 职场文书
滞留工资返还协议书
2014/10/19 职场文书
2016年党员公开承诺书格式范文
2016/03/24 职场文书
24句精辟的现实社会语录,句句扎心,道尽人性
2019/08/29 职场文书