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使用邻接矩阵构造图代码示例
Nov 10 Python
使用pygame模块编写贪吃蛇的实例讲解
Feb 05 Python
python smtplib模块自动收发邮件功能(二)
May 22 Python
Python实现两个list求交集,并集,差集的方法示例
Aug 02 Python
python 发送和接收ActiveMQ消息的实例
Jan 30 Python
django多对多表的创建,级联删除及手动创建第三张表
Jul 25 Python
python matplotlib拟合直线的实现
Nov 19 Python
python识别验证码图片实例详解
Feb 17 Python
Django模板之基本的 for 循环 和 List内容的显示方式
Mar 31 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
Dec 01 Python
python中K-means算法基础知识点
Jan 25 Python
这样写python注释让代码更加的优雅
Jun 02 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
Zend Framework教程之Resource Autoloading用法实例
2016/03/08 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
2016/04/23 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
Extjs入门之动态加载树代码
2010/04/09 Javascript
js下判断 iframe 是否加载完成的完美方法
2010/10/26 Javascript
用于节点操作的API,颠覆原生操作HTML DOM节点的API
2010/12/11 Javascript
一款jquery特效编写的大度宽屏焦点图切换特效的实例代码
2013/08/05 Javascript
JS获取浏览器语言动态加载JS文件示例代码
2014/10/31 Javascript
JavaScript实现时钟滴答声效果
2017/01/29 Javascript
jquery 仿锚点跳转到页面指定位置的实例
2017/02/14 Javascript
JS正则表达式验证中文字符
2017/05/08 Javascript
Angular2 组件通信的实例代码
2017/06/23 Javascript
JavaScript异步加载问题总结
2018/02/17 Javascript
vue组件实现进度条效果
2018/06/06 Javascript
VUE中v-on:click事件中获取当前dom元素的代码
2018/08/22 Javascript
Vuex的初探与实战小结
2018/11/26 Javascript
vueScroll实现移动端下拉刷新、上拉加载
2019/03/22 Javascript
JavaScript的查询机制LHS和RHS解析
2019/08/16 Javascript
JS自定义滚动条效果
2020/03/13 Javascript
node koa2 ssr项目搭建的方法步骤
2020/12/11 Javascript
python snownlp情感分析简易demo(分享)
2017/06/04 Python
Python实现的破解字符串找茬游戏算法示例
2017/09/25 Python
获取python的list中含有重复值的index方法
2018/06/27 Python
python批量修改图片大小的方法
2018/07/24 Python
Python 通过截图匹配原图中的位置(opencv)实例
2019/08/27 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
python pptx复制指定页的ppt教程
2020/02/14 Python
Python网络爬虫信息提取mooc代码实例
2020/03/06 Python
利用python+request通过接口实现人员通行记录上传功能
2021/01/13 Python
美国班级戒指、帽子和礼服、毕业产品、年鉴:Balfour
2018/11/01 全球购物
牵手50台湾:专为黄金岁月的单身人士而设的交友网站
2021/02/18 全球购物
旅游管理专业大学生职业规划书
2014/02/27 职场文书
英文推荐信格式范文
2014/05/09 职场文书
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
2021/04/27 Python
Redis三种集群模式详解
2021/10/05 Redis
vue2的 router在使用过程中遇到的一些问题
2022/04/13 Vue.js