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过滤函数filter()使用自定义函数过滤序列实例
Aug 26 Python
python fabric实现远程部署
Jan 05 Python
带你了解python装饰器
Jun 15 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
Jun 11 Python
Python动态生成多维数组的方法示例
Aug 09 Python
django基于cors解决跨域请求问题详解
Aug 06 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
Aug 17 Python
python 比较2张图片的相似度的方法示例
Dec 18 Python
openCV提取图像中的矩形区域
Jul 21 Python
python绘制分布折线图的示例
Sep 24 Python
Python plt 利用subplot 实现在一张画布同时画多张图
Feb 26 Python
python微信智能AI机器人实现多种支付方式
Apr 12 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日历程序
2006/12/06 PHP
php xml留言板 xml存储数据的简单例子
2009/08/24 PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
2013/11/07 PHP
php实现用于删除整个目录的递归函数
2015/03/16 PHP
PHP7 新特性详细介绍
2016/09/06 PHP
PHP 文件上传后端处理实用技巧方法
2017/01/06 PHP
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
2009/12/28 Javascript
jquery 学习之二 属性(html()与html(val))
2010/11/25 Javascript
JQuery.ajax传递中文参数的解决方法 推荐
2011/03/28 Javascript
表单验证的完整应用案例探讨
2013/03/29 Javascript
使用console进行性能测试
2015/04/27 Javascript
javascript实现点击后变换按钮显示文字的方法
2015/05/13 Javascript
JS简单验证上传文件类型的方法
2017/04/17 Javascript
vue.js评论发布信息可插入QQ表情功能
2017/08/08 Javascript
jQuery实现广告条滚动效果
2017/08/22 jQuery
jQuery实现本地存储
2020/12/22 jQuery
[00:32]DOTA2上海特级锦标赛 COL战队宣传片
2016/03/04 DOTA
[03:11]TI9战队档案 - Alliance
2019/08/20 DOTA
[50:02]完美世界DOTA2联赛循环赛 Magma vs IO BO2第一场 11.01
2020/11/02 DOTA
Python抓取京东图书评论数据
2014/08/31 Python
python中lambda与def用法对比实例分析
2015/04/30 Python
win7上python2.7连接mysql数据库的方法
2017/01/14 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
Python for循环与range函数的使用详解
2019/03/23 Python
OpenCV 之按位运算举例解析
2020/06/19 Python
python3中calendar返回某一时间点实例讲解
2020/11/18 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
详解移动端HTML5音频与视频问题及解决方案
2018/08/22 HTML / CSS
StubHub德国:购买和出售门票
2017/09/06 全球购物
For Art’s Sake官网:手工制作的奢华眼镜
2018/12/15 全球购物
Lentiamo荷兰:在线订购隐形眼镜、隐形眼镜液和太阳镜
2019/10/25 全球购物
医校毕业生自我鉴定
2014/01/25 职场文书
机关作风建设自查报告及整改措施
2014/10/21 职场文书
创业计划书之韩国烧烤店
2019/09/19 职场文书
python 中的@运算符使用
2021/05/26 Python
CSS 伪元素::marker详解
2021/06/26 HTML / CSS