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 相关文章推荐
Django中实现一个高性能计数器(Counter)实例
Jul 09 Python
Python使用cookielib模块操作cookie的实例教程
Jul 12 Python
python使用matplotlib画柱状图、散点图
Mar 18 Python
python 中的列表生成式、生成器表达式、模块导入
Jun 19 Python
用python写一个定时提醒程序的实现代码
Jul 22 Python
Tensorflow的常用矩阵生成方式
Jan 04 Python
快速解决jupyter启动卡死的问题
Apr 10 Python
快速解决jupyter notebook启动需要密码的问题
Apr 21 Python
golang/python实现归并排序实例代码
Aug 30 Python
Django通过设置CORS解决跨域问题
Nov 26 Python
python实现不同数据库间数据同步功能
Feb 25 Python
python3+PyQt5+Qt Designer实现界面可视化
Jun 10 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将数组存储为文本文件方法汇总
2015/10/28 PHP
图文详解phpstorm配置Xdebug进行调试PHP教程
2016/06/13 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
JS location几个方法小姐
2008/07/09 Javascript
javascript 面向对象编程 聊聊对象的事
2009/09/17 Javascript
JavaScript使用过程中需要注意的地方和一些基本语法
2010/08/26 Javascript
table对象中的insertRow与deleteRow使用示例
2014/01/26 Javascript
javascript页面渲染速度测试脚本分享
2014/04/15 Javascript
深入探密Javascript数组方法
2015/01/08 Javascript
jQuery实现购物车表单自动结算效果实例
2015/08/10 Javascript
JS实现自动切换文字的导航效果代码
2015/08/27 Javascript
BootStrap的JS插件之轮播效果案例详解
2016/05/16 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
jquery获取easyui日期控件的值实现方法
2016/11/09 Javascript
详解webpack es6 to es5支持配置
2017/05/04 Javascript
Nodejs进阶之服务端字符编解码和乱码处理
2017/09/04 NodeJs
es6在react中的应用代码解析
2017/11/08 Javascript
axios中cookie跨域及相关配置示例详解
2017/12/20 Javascript
webuploader实现上传图片到服务器功能
2018/08/16 Javascript
Vue-router的使用和出现空白页,路由对象属性详解
2018/09/03 Javascript
详解微信小程序网络请求接口封装实例
2019/05/02 Javascript
JS代码实现页面切换效果
2021/01/10 Javascript
学习python类方法与对象方法
2016/03/15 Python
Python中functools模块的常用函数解析
2016/06/30 Python
Python列表list解析操作示例【整数操作、字符操作、矩阵操作】
2017/07/25 Python
Django 连接sql server数据库的方法
2018/06/30 Python
关于django 1.10 CSRF验证失败的解决方法
2019/08/31 Python
夜大毕业生自我评价分享
2013/11/10 职场文书
幼儿园教师工作制度
2014/01/22 职场文书
初中班级口号
2014/06/09 职场文书
创先争优活动党员公开承诺书
2014/08/29 职场文书
推广普通话共筑中国梦演讲稿
2014/09/21 职场文书
群众路线班子对照检查材料
2014/09/25 职场文书
企业2014年度工作总结
2014/12/10 职场文书
南京导游词
2015/02/03 职场文书