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相似模块用例
Mar 04 Python
Python基于回溯法子集树模板解决0-1背包问题实例
Sep 02 Python
Python读取系统文件夹内所有文件并统计数量的方法
Oct 23 Python
python numpy实现文件存取的示例代码
May 26 Python
python 上下文管理器及自定义原理解析
Nov 19 Python
python psutil监控进程实例
Dec 17 Python
Python opencv相机标定实现原理及步骤详解
Apr 09 Python
如何在keras中添加自己的优化器(如adam等)
Jun 19 Python
Python如何读写二进制数组数据
Aug 01 Python
如何把python项目部署到linux服务器
Aug 26 Python
详解python算法常用技巧与内置库
Oct 17 Python
python FTP编程基础入门
Feb 27 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
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
2013/02/06 PHP
PHP禁止个别IP访问网站
2013/10/30 PHP
php二维数组排序方法(array_multisort usort)
2013/12/25 PHP
thinkphp模板用法和内容输出实例
2014/11/28 PHP
thinkphp3.2点击刷新生成验证码
2016/02/16 PHP
比较搞笑的js陷阱题
2010/02/07 Javascript
js判断生效时间不得大于失效时间的思路及代码
2013/04/23 Javascript
js动态给table添加/删除tr的方法
2013/08/02 Javascript
javasript实现密码的隐藏与显示
2015/05/08 Javascript
javascript实现获取服务器时间
2015/05/19 Javascript
Vue.js创建Calendar日历效果
2016/11/03 Javascript
Vue.js基础知识小结
2017/01/13 Javascript
详解微信小程序入门五: wxml文件引用、模版、生命周期
2017/01/20 Javascript
jQuery提示框插件SweetAlert用法分析
2019/08/05 jQuery
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
jquery向后台提交数组的代码分析
2020/02/20 jQuery
微信小程序以ssm做后台开发的实现示例
2020/04/08 Javascript
JavaScript console的使用方法实例分析
2020/04/28 Javascript
浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑
2020/09/12 Javascript
在python中的socket模块使用代理实例
2014/05/29 Python
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
python函数的万能参数传参详解
2019/07/26 Python
Python Gitlab Api 使用方法
2019/08/28 Python
使用pytorch完成kaggle猫狗图像识别方式
2020/01/10 Python
学习Python需要哪些工具
2020/09/04 Python
卡塔尔航空官方网站:Qatar Airways
2017/02/08 全球购物
美国男士和女士奢侈品折扣手表购物网站:Certified Watch Store
2018/06/13 全球购物
WebSphere 应用服务器都支持哪些认证
2013/12/26 面试题
简述synchronized和java.util.concurrent.locks.Lock的异同
2014/12/08 面试题
港湾网络笔试题
2014/04/19 面试题
大学同学聚会邀请函
2014/01/29 职场文书
测量工程专业求职信
2014/02/24 职场文书
教育技术学专业职业规划书
2014/03/03 职场文书
ktv好的活动方案
2014/08/17 职场文书
学习党代会心得体会
2014/09/05 职场文书
师德师风整改措施
2014/10/24 职场文书