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基于smtplib实现异步发送邮件服务
May 28 Python
分析并输出Python代码依赖的库的实现代码
Aug 09 Python
python复制列表时[:]和[::]之间有什么区别
Oct 16 Python
详解Python基础random模块随机数的生成
Mar 23 Python
Python 函数list&amp;read&amp;seek详解
Aug 28 Python
python 模拟创建seafile 目录操作示例
Sep 26 Python
Python + Requests + Unittest接口自动化测试实例分析
Dec 12 Python
Python GUI库PyQt5样式QSS子控件介绍
Feb 25 Python
Python 之 Json序列化嵌套类方式
Feb 27 Python
Python机器学习之KNN近邻算法
May 14 Python
教你利用python实现企业微信发送消息
May 23 Python
python使用pymysql模块操作MySQL
Jun 16 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
基于mysql的论坛(1)
2006/10/09 PHP
php中获取关键词及所属来源搜索引擎名称的代码
2011/02/15 PHP
PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
2012/07/15 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
2013/06/23 PHP
PHP读取配置文件类实例(可读取ini,yaml,xml等)
2015/07/28 PHP
JavaScript 计算当天是本年本月的第几周
2009/03/22 Javascript
JS实现多物体缓冲运动实例代码
2013/11/29 Javascript
用jquery等比例控制图片宽高的具体实现
2014/01/28 Javascript
Web 开发中Ajax的Session 超时处理方法
2017/01/19 Javascript
微信小程序 获取二维码实例详解
2017/06/23 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
2017/08/03 Javascript
js实现把时间戳转换为yyyy-MM-dd hh:mm 格式(es6语法)
2017/12/28 Javascript
vue里面父组件修改子组件样式的方法
2018/02/03 Javascript
解决vue数组中对象属性变化页面不渲染问题
2018/08/09 Javascript
[03:59]第二届DOTA2亚洲邀请赛选手传记-VGJ.rOtk
2017/04/03 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频
2018/12/05 DOTA
详解Python中内置的NotImplemented类型的用法
2015/03/31 Python
Python3.2中的字符串函数学习总结
2015/04/23 Python
用python编写第一个IDA插件的实例
2018/05/29 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
python 提取tuple类型值中json格式的key值方法
2018/12/31 Python
Python3 log10()函数简单用法
2019/02/19 Python
Python.append()与Python.expand()用法详解
2019/12/18 Python
Python 脚本的三种执行方式小结
2019/12/21 Python
python将音频进行变速的操作方法
2020/04/08 Python
Django与pyecharts结合的实例代码
2020/05/13 Python
解决CSS3的opacity属性带来的层叠顺序问题
2016/05/09 HTML / CSS
俄罗斯有趣和原创礼物网上商店:MagicMag
2019/08/01 全球购物
出纳岗位职责
2013/11/09 职场文书
学期自我评价
2014/01/27 职场文书
房屋租赁授权委托书范本
2014/09/20 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
自我推荐信怎么写
2015/03/24 职场文书
2015年幼儿园保育工作总结
2015/05/12 职场文书
《钢铁是怎样炼成的》高中读后感
2019/08/07 职场文书
超详细Python解释器新手安装教程
2021/05/10 Python