Django 登陆验证码和中间件的实现


Posted in Python onAugust 17, 2018

验证码

在用户注册、登陆页面为了防止暴力请求,可以加入验证码。如果验证码错误,则不需要继续处理,可以减轻服务器的压力

使用验证码也是一种有效防止 csrf 的方法

def verifycode(request):
  #引入绘图模块
  from PIL import Image, ImageDraw, ImageFont
  #引入随机函数模块
  import random
  #定义变量,用于画面的背景色、宽、高
  bgcolor = (random.randrange(20, 100), random.randrange(
    20, 100), random.randrange(20, 100))
  width = 100
  height = 50
  #创建画面对象
  im = Image.new('RGB', (width, height), bgcolor)
  #创建画笔对象
  draw = ImageDraw.Draw(im)
  #调用画笔的point()函数绘制噪点
  for i in range(0, 100):
    xy = (random.randrange(0, width), random.randrange(0, height))
    fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
    draw.point(xy, fill=fill)
  #定义验证码的备选值
  str = '1234567890QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm'
  #随机选取4个值作为验证码
  rand_str = ''
  for i in range(0, 4):
    rand_str += str[random.randrange(0, len(str))]
  #构造字体对象
  font = ImageFont.truetype(r'C:\Windows\Fonts\AdobeArabic-Bold.otf', 40)
  #构造字体颜色
  fontcolor1 = (255, random.randrange(0, 255), random.randrange(0, 255))
  fontcolor2 = (255, random.randrange(0, 255), random.randrange(0, 255))
  fontcolor3 = (255, random.randrange(0, 255), random.randrange(0, 255))
  fontcolor4 = (255, random.randrange(0, 255), random.randrange(0, 255))
  #绘制4个字
  draw.text((5, 2), rand_str[0], font=font, fill=fontcolor1)
  draw.text((25, 2), rand_str[1], font=font, fill=fontcolor2)
  draw.text((50, 2), rand_str[2], font=font, fill=fontcolor3)
  draw.text((75, 2), rand_str[3], font=font, fill=fontcolor4)
  #释放画笔
  del draw

  #内存文件操作
  import io
  buf = io.BytesIO()
  #将图片保存在内存中,文件类型为png
  im.save(buf, 'png')
  #将内存中的图片数据返回给客户端,MIME类型为图片png
  response = HttpResponse(buf.getvalue(), 'image/png')

  #将验证码的值写入cookie,以被前端浏览器验证验证码
  # response.set_cookie("verifycode", rand_str)

  # 存入session,用于做进一步验证
  request.session['verifycode'] = rand_str

  return response
def login(request):
  if request.method == "GET":
    infoStr = "<h1>sunck is a good man</h1>"
    # infoStr = "<script>alert('sunck good')</script>"
    return render(request, "login.html", {"infoStr":infoStr})
  else:
    #判断验证码
    verifycode = request.POST.get("verifycode")
    if not verifycode.upper() == request.session.get("verifycode").upper():
      return redirect("/login/")

    username = request.POST.get("username")
    password = request.POST.get("password")
    if username == "sunck" and password == "sunck1999":
      return redirect("/index/")
    else:
      return redirect("/login/")

中间件

概述

一个轻量级、底层的插件系统,可以介入 Django 的请求和响应过程,处理Django 的输入或输出。每个中间件组件都是一个独立的 Python 类。

django 中间件简单图解

Django 登陆验证码和中间件的实现 

方法

Django 登陆验证码和中间件的实现 

自定义中间件

在 App 目录下创建名为 middlewares 的包

在包中创建自己的中间件类文件

verifycodeMiddleware.py

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect


class VerifycodeMiddleware(MiddlewareMixin):
  def process_request(self, request):
    print("***************", request.path)
    if request.path == "/login/" and request.method == "POST":
      # 判断验证码
      verifycode = request.POST.get("verifycode")
      if not verifycode.upper() == request.session.get("verifycode").upper():
        return redirect("/login/")

在 settings.py 文件中配阿置 MIDDLEWARE

'myApp.middlewares.verifycodeMiddleware.VerifycodeMiddleware'

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python与sqlite3实现解密chrome cookie实例代码
Jan 20 Python
windows环境下tensorflow安装过程详解
Mar 30 Python
Python之dict(或对象)与json之间的互相转化实例
Jun 05 Python
python 接收处理外带的参数方法
Dec 03 Python
Python Pexpect库的简单使用方法
Jan 29 Python
详解python运行三种方式
May 13 Python
Python 保持登录状态进行接口测试的方法示例
Aug 06 Python
python pillow模块使用方法详解
Aug 30 Python
使用IDLE的Python shell窗口实例详解
Nov 19 Python
keras实现theano和tensorflow训练的模型相互转换
Jun 19 Python
python3.5的包存放的具体路径
Aug 16 Python
python中lower函数实现方法及用法讲解
Dec 23 Python
python读取Excel实例详解
Aug 17 #Python
python框架中flask知识点总结
Aug 17 #Python
Flask Web开发入门之文件上传(八)
Aug 17 #Python
python操作excel的方法
Aug 16 #Python
python3调用百度翻译API实现实时翻译
Aug 16 #Python
Python用于学习重要算法的模块pygorithm实例浅析
Aug 16 #Python
Python pygorithm模块用法示例【常见算法测试】
Aug 16 #Python
You might like
千呼万唤始出来,DOTA2勇士令状不朽宝藏Ⅱ现已推出
2020/08/25 DOTA
ThinkPHP模板自定义标签使用方法
2014/06/26 PHP
php使用iconv中文截断问题的解决方法
2015/02/11 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
2019/06/03 PHP
JavaScript静态的动态
2006/09/18 Javascript
javascript 实现子父窗体互相传值的简单实例
2014/02/17 Javascript
Jquery仿IGoogle实现可拖动窗口示例代码
2014/08/22 Javascript
详解Bootstrap glyphicons字体图标
2016/01/04 Javascript
jQuery form 表单验证插件(fieldValue)校验表单
2016/01/24 Javascript
JS遍历页面所有对象属性及实现方法
2016/08/01 Javascript
解析javascript图片懒加载与预加载的分析总结
2016/10/27 Javascript
Node.js Mongodb 密码特殊字符 @的解决方法
2017/04/11 Javascript
详解Vue-Cli 异步加载数据的一些注意点
2017/08/12 Javascript
jQuery实现简单的回到顶部totop功能示例
2017/10/16 jQuery
Vue组件创建和传值的方法
2018/08/17 Javascript
微信小程序之swiper滑动面板用法示例
2018/12/04 Javascript
聊聊Vue 中 title 的动态修改问题
2019/06/11 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
2019/08/12 Javascript
小程序实现层叠卡片滑动效果
2019/08/26 Javascript
vue组件暴露和.js文件暴露接口操作
2020/08/11 Javascript
ant-design-vue 时间选择器赋值默认时间的操作
2020/10/27 Javascript
[53:52]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
使用python检测手机QQ在线状态的脚本代码
2013/02/10 Python
python返回昨天日期的方法
2015/05/13 Python
python2.x实现人民币转大写人民币
2018/06/20 Python
python小白学习包管理器pip安装
2020/06/09 Python
Flask中jinja2的继承实现方法及实例
2021/03/03 Python
css3的过滤效果简单实例
2016/08/03 HTML / CSS
CSS3 实现弹跳的小球动画
2020/10/26 HTML / CSS
意大利香水和化妆品购物网站:Parfimo.it
2019/10/06 全球购物
C语言怎样定义和声明全局变量和函数最好
2013/11/26 面试题
热能动力工程毕业生自荐信
2013/11/07 职场文书
涨工资申请书应该怎么写?
2019/07/08 职场文书
HTML速写之Emmet语法规则的实现
2021/04/07 HTML / CSS
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript