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中使用语句导入模块或包的机制研究
Mar 30 Python
python实现读取并显示图片的两种方法
Jan 13 Python
在python中使用正则表达式查找可嵌套字符串组
Oct 24 Python
PyCharm的设置方法和第一个Python程序的建立
Jan 16 Python
Python CVXOPT模块安装及使用解析
Aug 01 Python
如何利用pygame实现简单的五子棋游戏
Dec 29 Python
通过实例解析python描述符原理作用
Jan 22 Python
python tkinter之顶层菜单、弹出菜单实例
Mar 04 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
Apr 24 Python
Django 用户认证Auth组件的使用
Nov 30 Python
python实现简易名片管理系统
Apr 11 Python
python实现对doc、txt、xls等文档的读写操作
Apr 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
PHP中usort在值相同时改变原始位置问题的解决方法
2011/11/27 PHP
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
2014/05/10 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
JS在IE和FF下attachEvent,addEventListener学习笔记
2009/11/26 Javascript
jquery插件开发注意事项小结
2013/06/04 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
2013/11/19 Javascript
JS中表单的使用小结
2014/01/11 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 语法
2015/01/09 Javascript
javascript实现确定和取消提示框效果
2015/07/10 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
2015/11/16 Javascript
Bootstrap开关(switch)控件学习笔记分享
2016/05/30 Javascript
详解js界面跳转与值传递
2016/11/22 Javascript
Three.js开发实现3D地图的实践过程总结
2017/11/20 Javascript
vue项目初始化到登录login页面的示例
2019/10/31 Javascript
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
基于 Vue 的 Electron 项目搭建过程图文详解
2020/07/22 Javascript
[02:51]DOTA2英雄基础教程 艾欧
2014/01/13 DOTA
[46:48]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第三局
2016/02/25 DOTA
python 生成不重复的随机数的代码
2011/05/15 Python
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
Python 解决中文写入Excel时抛异常的问题
2018/05/03 Python
详解django2中关于时间处理策略
2019/03/06 Python
根据tensor的名字获取变量的值方式
2020/01/04 Python
TensorFlow 读取CSV数据的实例
2020/02/05 Python
python代码实现将列表中重复元素之间的内容全部滤除
2020/05/22 Python
世界上最大的皮肤科医生拥有和经营的美容网站:LovelySkin
2021/01/03 全球购物
类的核心特性有哪些
2014/01/01 面试题
linux面试题参考答案(6)
2014/08/29 面试题
水污染治理专业毕业生推荐信
2013/11/14 职场文书
工程管理专业毕业生自荐信
2014/01/24 职场文书
大学生毕业求职自荐书范文
2014/02/04 职场文书
鲜花方阵解说词
2014/02/13 职场文书
任命书模板
2014/06/04 职场文书
法语专业求职信
2014/07/20 职场文书
迎新晚会主持词开场白
2015/05/28 职场文书
在虚拟机中安装windows server 2008的图文教程
2022/06/28 Servers