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生成器的使用方法
Nov 21 Python
跟老齐学Python之不要红头文件(1)
Sep 28 Python
python中循环语句while用法实例
May 16 Python
python基于itchat实现微信群消息同步机器人
Feb 27 Python
python opencv之分水岭算法示例
Feb 24 Python
用python实现百度翻译的示例代码
Mar 09 Python
python调用java的jar包方法
Dec 15 Python
Python生成一个迭代器的实操方法
Jun 18 Python
Python3批量生成带logo的二维码方法
Jun 24 Python
使用已经得到的keras模型识别自己手写的数字方式
Jun 29 Python
python实现登录与注册系统
Nov 30 Python
anaconda升级sklearn版本的实现方法
Feb 22 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
URL Rewrite的设置方法
2007/01/02 PHP
解析PHP中ob_start()函数的用法
2013/06/24 PHP
PHP获取windows登录用户名的方法
2014/06/24 PHP
修改WordPress中文章编辑器的样式的方法详解
2015/12/15 PHP
PHP时间类完整实例(非常实用)
2015/12/25 PHP
Yii2中事务的使用实例代码详解
2016/09/07 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
laravel中短信发送验证码的实现方法
2018/04/25 PHP
JavaScript 事件冒泡简介及应用
2010/01/11 Javascript
jquery 中的each()跳出循环的语句
2014/05/23 Javascript
使用JavaScript开发IE浏览器本地插件实例
2015/02/18 Javascript
Bootstrap的图片轮播示例代码
2015/08/31 Javascript
AngularJS基础 ng-cut 指令介绍及简单示例
2016/08/01 Javascript
搭建Bootstrap离线文档的方法
2016/12/02 Javascript
Angular.JS中的指令引用template与指令当做属性详解
2017/03/30 Javascript
Bootstrap table学习笔记(2) 前后端分页模糊查询
2017/05/18 Javascript
详解Vue爬坑之vuex初识
2017/06/14 Javascript
js求数组中全部数字可拼接出的最大整数示例代码
2017/08/25 Javascript
原生JS实现日历组件的示例代码
2017/09/22 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
2017/12/16 Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
Vue实现剪切板图片压缩功能
2020/02/04 Javascript
Vue 中使用 typescript的方法详解
2020/02/17 Javascript
Python中Collection的使用小技巧
2014/08/18 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
2017/05/08 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
2020/04/07 Python
使用css创建三角形 使用CSS3创建3d四面体原理及代码(html5实践)
2013/01/06 HTML / CSS
Yahoo的PHP面试题
2014/05/26 面试题
环境科学专业个人求职信
2013/09/26 职场文书
售后主管岗位职责
2013/12/08 职场文书
母亲七十大寿答谢词
2014/01/18 职场文书
加多宝凉茶广告词
2014/03/18 职场文书
乔布斯斯坦福大学演讲稿
2014/05/23 职场文书
房地产经营管理专业自荐信
2014/09/02 职场文书
教师节感谢信
2015/01/22 职场文书
新生儿未入户证明
2015/06/23 职场文书