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通过线程实现定时器timer的方法
Mar 16 Python
python中print的不换行即时输出的快速解决方法
Jul 20 Python
解决python升级引起的pip执行错误的问题
Jun 12 Python
Tensorflow 合并通道及加载子模型的方法
Jul 26 Python
Selenium的使用详解
Oct 19 Python
python requests爬取高德地图数据的实例
Nov 10 Python
pyshp创建shp点文件的方法
Dec 31 Python
Python安装selenium包详细过程
Jul 23 Python
如何基于Python实现电子邮件的发送
Dec 16 Python
简单了解django处理跨域请求最佳解决方案
Mar 25 Python
Python转换字典成为对象,可以用&quot;.&quot;方式访问对象属性实例
May 11 Python
Pycharm连接gitlab实现过程图解
Sep 01 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中strtotime函数使用方法详解
2011/11/27 PHP
php中一个有意思的日期逻辑处理
2012/03/25 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
2013/11/12 PHP
php 字符串压缩方法比较示例
2014/01/23 PHP
20个2014年最优秀的PHP框架回顾
2014/10/22 PHP
PHP实现二维数组根据key进行排序的方法
2016/12/30 PHP
基于jquery的自定义鼠标提示效果 jquery.toolTip
2010/11/14 Javascript
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
两个多选select(multiple左右)添加、删除选项和取值实例
2014/05/12 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
运行Node.js的IIS扩展iisnode安装配置笔记
2015/03/02 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
2015/11/25 Javascript
利用jQuery实现打字机字幕效果实例代码
2016/09/02 Javascript
js判断请求的url是否可访问,支持跨域判断的实现方法
2016/09/17 Javascript
微信小程序自定义可滑动日历界面
2018/12/28 Javascript
Layer+Echarts构建弹出层折线图的方法
2019/09/25 Javascript
vue实现表格合并功能
2020/12/01 Vue.js
python根据距离和时长计算配速示例
2014/02/16 Python
python基于phantomjs实现导入图片
2016/05/13 Python
Django中login_required装饰器的深入介绍
2017/11/24 Python
python语言中with as的用法使用详解
2018/02/23 Python
Python安装图文教程 Pycharm安装教程
2018/03/27 Python
python2.7实现爬虫网页数据
2018/05/25 Python
Python面向对象之类的封装操作示例
2019/06/08 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
Django数据统计功能count()的使用
2020/11/30 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
2021/01/12 Python
如何使用localstorage代替cookie实现跨域共享数据问题
2018/04/18 HTML / CSS
5分钟实现Canvas鼠标跟随动画背景
2019/11/18 HTML / CSS
班组长安全职责
2014/01/05 职场文书
合作协议书格式
2014/08/19 职场文书
六查六看个人剖析材料
2014/10/14 职场文书
土木工程生产实习心得体会
2016/01/22 职场文书
解决persistence.xml配置文件修改存放路径的问题
2022/02/24 Java/Android
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL
MySQL一劳永逸永久支持输入中文的方法实例
2022/08/05 MySQL