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正则表达式操作指南(re使用)
Sep 06 Python
Python通过websocket与js客户端通信示例分析
Jun 25 Python
Python 获取新浪微博的最新公共微博实例分享
Jul 03 Python
深入解析Python设计模式编程中建造者模式的使用
Mar 02 Python
Python中random模块生成随机数详解
Mar 10 Python
对Python进行数据分析_关于Package的安装问题
May 22 Python
Python使用re模块正则提取字符串中括号内的内容示例
Jun 01 Python
Python全局变量与局部变量区别及用法分析
Sep 03 Python
Python/ArcPy遍历指定目录中的MDB文件方法
Oct 27 Python
python创建属于自己的单词词库 便于背单词
Jul 30 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
Sep 11 Python
Python pytesseract验证码识别库用法解析
Jun 29 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 中提示undefined index如何解决(多种方法)
2016/03/16 PHP
Zend Framework+smarty用法实例详解
2016/03/19 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
2012/07/20 Javascript
说说JSON和JSONP 也许你会豁然开朗
2012/09/02 Javascript
jquery聚焦文本框与扩展文本框聚焦方法
2012/10/12 Javascript
很好用的js日历算法详细代码
2013/03/07 Javascript
浏览器页面区域大小的js获取方法
2013/09/21 Javascript
jquery插件bxslider用法实例分析
2015/04/16 Javascript
JS实现两表格里数据来回转移的方法
2015/05/28 Javascript
JavaScript实现三级联动菜单实例代码
2017/06/26 Javascript
Grunt针对静态文件的压缩,版本控制打包的实例讲解
2017/09/29 Javascript
JavaScript实现的超简单计算器功能示例
2017/12/23 Javascript
vue.js 实现图片本地预览 裁剪 压缩 上传功能
2018/03/01 Javascript
ES6中let 和 const 的新特性
2018/09/03 Javascript
vue中的v-if和v-show的区别详解
2019/09/01 Javascript
JavaScript ES 模块的使用
2020/11/12 Javascript
[01:04:48]VGJ.S vs TNC Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
使用Python的Flask框架来搭建第一个Web应用程序
2016/06/04 Python
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
安德玛比利时官网:Under Armour比利时
2019/08/28 全球购物
幼儿园教师奖惩制度
2014/02/01 职场文书
培训班主持词
2014/03/28 职场文书
和睦家庭事迹
2014/05/14 职场文书
优秀家长事迹材料
2014/05/17 职场文书
竞选宣传委员演讲稿
2014/05/24 职场文书
感恩教育月活动总结
2014/07/07 职场文书
工作态度不端正检讨书
2014/10/04 职场文书
运动会广播稿200米(5篇)
2014/10/15 职场文书
精神病医院见习报告
2014/11/03 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
2014年平安建设工作总结
2014/11/19 职场文书
家长学校教学计划
2015/01/19 职场文书
导游词之河北野三坡
2019/12/11 职场文书
MySQL示例讲解数据库约束以及表的设计
2022/06/16 MySQL
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
2022/09/23 Servers