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中不同进制互相转换(二进制、八进制、十进制和十六进制)
Apr 05 Python
Python中使用插入排序算法的简单分析与代码示例
May 04 Python
python实现在IDLE中输入多行的方法
Apr 19 Python
对python中的xlsxwriter库简单分析
May 04 Python
TensorFlow实现卷积神经网络
May 24 Python
python查看模块安装位置的方法
Oct 16 Python
python实现感知器算法(批处理)
Jan 18 Python
python实现支付宝转账接口
May 07 Python
linux中如何使用python3获取ip地址
Jul 15 Python
Pandas实现dataframe和np.array的相互转换
Nov 30 Python
python 如何获取页面所有a标签下href的值
May 06 Python
Python利用capstone实现反汇编
Apr 06 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中获取变量的变量名的一段代码的bug分析
2011/07/07 PHP
用php实现百度网盘图片直链的代码分享
2012/11/01 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
Smarty模板类内部原理实例分析
2019/07/03 PHP
JQuery 小练习(实例代码)
2009/08/07 Javascript
腾讯的ip接口 方便获取当前用户的ip地理位置
2010/11/25 Javascript
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
jquery中one()方法的用法实例
2015/01/16 Javascript
jquery使用slideDown实现模块缓慢拉出效果的方法
2015/03/27 Javascript
javascript中call和apply的用法示例分析
2015/04/02 Javascript
使用AOP改善javascript代码
2015/05/01 Javascript
JavaScript头像上传插件源码分享
2016/03/29 Javascript
jQuery代码实现图片墙自动+手动淡入淡出切换效果
2016/05/09 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
2016/08/28 Javascript
详解nodejs 文本操作模块-fs模块(四)
2016/12/22 NodeJs
Mac系统下Webstorm快捷键整理大全
2017/05/28 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
vue中的mvvm模式讲解
2019/01/31 Javascript
javascript实现的时间格式加8小时功能示例
2019/06/13 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
Python中subprocess的简单使用示例
2015/07/28 Python
python和shell获取文本内容的方法
2018/06/05 Python
Python语言检测模块langid和langdetect的使用实例
2019/02/19 Python
Pandas之MultiIndex对象的示例详解
2019/06/25 Python
Python爬虫 批量爬取下载抖音视频代码实例
2019/08/16 Python
使用python脚本自动创建pip.ini配置文件代码实例
2019/09/20 Python
如何基于pythonnet调用halcon脚本
2020/01/20 Python
一文了解python 3 字符串格式化 F-string 用法
2020/03/04 Python
python实现Oracle查询分组的方法示例
2020/04/30 Python
如何用python 操作zookeeper
2020/12/28 Python
营销主管自我评价怎么写
2013/09/19 职场文书
医院护士的求职信范文
2013/12/26 职场文书
医学生自我评价
2014/01/27 职场文书
法律顾问服务方案
2014/05/15 职场文书
验房委托书
2014/08/30 职场文书
2016大一新生入学教育心得体会
2016/01/23 职场文书