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实现2014火车票查询代码分享
Jan 10 Python
Python获取Linux系统下的本机IP地址代码分享
Nov 07 Python
Python实现Tab自动补全和历史命令管理的方法
Mar 12 Python
Python sys.argv用法实例
May 28 Python
详解python3实现的web端json通信协议
Dec 29 Python
Python字符串拼接的几种方法整理
Aug 02 Python
Django unittest 设置跳过某些case的方法
Dec 26 Python
使用Python操作FTP实现上传和下载的方法
Apr 01 Python
Python3 批量扫描端口的例子
Jul 25 Python
使用NumPy读取MNIST数据的实现代码示例
Nov 20 Python
tensorflow 实现打印pb模型的所有节点
Jan 23 Python
VSCode配合pipenv搞定虚拟环境的实现方法
May 17 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
在PHP中利用XML技术构造远程服务(下)
2006/10/09 PHP
PHP实现文件上传下载实例
2016/10/18 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
兼容Mozilla必须知道的知识。
2007/01/09 Javascript
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
利用cookie记住背景颜色示例代码
2013/11/04 Javascript
JavaScript操作HTML元素和样式的方法详解
2015/10/21 Javascript
JavaScript代码生成PDF文件的方法
2016/02/26 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
2016/05/18 Javascript
easyui form validate总是返回false的原因及解决方法
2016/11/07 Javascript
详解微信小程序 登录获取unionid
2017/06/27 Javascript
jQuery中图片展示插件highslide.js的简单dom
2018/04/22 jQuery
详解vue通过NGINX部署在子目录或者二级目录实践
2018/09/03 Javascript
VUE简单的定时器实时刷新的实现方法
2019/01/20 Javascript
JavaScript设计模式--简单工厂模式定义与应用案例详解
2020/05/23 Javascript
Python实现Linux中的du命令
2017/06/12 Python
Python使用修饰器执行函数的参数检查功能示例
2017/09/26 Python
tensorflow建立一个简单的神经网络的方法
2018/02/10 Python
详解Python用户登录接口的方法
2019/04/17 Python
OpenCV 边缘检测
2019/07/10 Python
python爬虫 基于requests模块的get请求实现详解
2019/08/20 Python
解决python 读取excel时 日期变成数字并加.0的问题
2019/10/08 Python
Django自定义用户表+自定义admin后台中的字段实例
2019/11/18 Python
Python动态强类型解释型语言原理解析
2020/03/25 Python
新手学python应该下哪个版本
2020/06/11 Python
英国领先的瓷砖专家:Walls and Floors
2018/04/27 全球购物
一套PHP的笔试题
2013/05/31 面试题
竞职演讲稿范文
2014/01/11 职场文书
交通事故协议书范文
2014/04/16 职场文书
个人违纪检讨书
2014/09/15 职场文书
教师批评与自我批评总结
2014/10/16 职场文书
捐助倡议书
2015/01/19 职场文书
2015年个人实习工作总结
2015/05/28 职场文书
mysql外连接与内连接查询的不同之处
2021/06/03 MySQL
十大最强岩石系宝可梦,怪颚龙实力最强,第七破坏力很强
2022/03/18 日漫