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实现换行符转换的脚本的教程
Apr 16 Python
win7上python2.7连接mysql数据库的方法
Jan 14 Python
python实现朴素贝叶斯分类器
Mar 28 Python
使用NumPy和pandas对CSV文件进行写操作的实例
Jun 14 Python
python opencv 批量改变图片的尺寸大小的方法
Jun 28 Python
Python列表list常用内建函数实例小结
Oct 22 Python
Python常用模块logging——日志输出功能(示例代码)
Nov 20 Python
Django集成celery发送异步邮件实例
Dec 17 Python
Django 解决新建表删除后无法重新创建等问题
May 21 Python
解决redis与Python交互取出来的是bytes类型的问题
Jul 16 Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
Feb 18 Python
python实现简单文件读写函数
Feb 25 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数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
2011/10/29 PHP
PHP遍历某个目录下的所有文件和子文件夹的实现代码
2013/06/28 PHP
浅谈PDO的rowCount函数
2015/06/18 PHP
详解PHP的Yii框架中组件行为的属性注入和方法注入
2016/03/18 PHP
php 微信公众平台开发模式实现多客服的实例代码
2016/11/07 PHP
php生成无限栏目树
2017/03/16 PHP
Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作
2017/06/30 PHP
PHP结合Vue实现滚动底部加载效果
2017/12/17 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
极酷的javascirpt,让你随意编辑任何网页
2007/02/25 Javascript
一个简单的js鼠标划过切换效果
2010/06/30 Javascript
关于js datetime的那点事
2011/11/15 Javascript
jQuery拖动图片删除示例
2013/05/10 Javascript
Jquery AJAX POST与GET之间的区别
2013/11/14 Javascript
js的2种继承方式详解
2014/03/04 Javascript
JavaScript中isPrototypeOf函数作用和使用实例
2015/06/01 Javascript
JavaScript中的bold()方法使用详解
2015/06/08 Javascript
理解javascript异步编程
2016/01/27 Javascript
PHP获取当前页面完整URL的方法
2016/12/02 Javascript
node.js基于mongodb的搜索分页示例
2017/01/22 Javascript
vue中component组件的props使用详解
2017/09/04 Javascript
详解vue中localStorage的使用方法
2018/11/22 Javascript
VUE中使用MUI方法
2019/02/12 Javascript
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
vue实现Input输入框模糊查询方法
2021/01/29 Javascript
vue+Element-ui实现登录注册表单
2020/11/17 Javascript
Python 元组(Tuple)操作详解
2014/03/11 Python
Python中的pass语句使用方法讲解
2015/05/14 Python
Python文件与文件夹常见基本操作总结
2016/09/19 Python
一行python实现树形结构的方法
2019/08/09 Python
tensorflow estimator 使用hook实现finetune方式
2020/01/21 Python
html5 的a标签 Href 拨电话的写法
2013/11/04 HTML / CSS
兼职学生的自我评价
2013/11/24 职场文书
元旦晚会上单位领导演讲稿
2014/01/05 职场文书
选择比努力更重要?这是长期以来对“努力”的最大误解
2019/07/12 职场文书
postgresql使用filter进行多维度聚合的解决方法
2021/07/16 PostgreSQL