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实现的守护进程(Daemon)用法实例
Jun 02 Python
python中abs&amp;map&amp;reduce简介
Feb 20 Python
遗传算法python版
Mar 19 Python
python 通过xml获取测试节点和属性的实例
Mar 31 Python
python pandas中DataFrame类型数据操作函数的方法
Apr 08 Python
pygame游戏之旅 添加键盘按键的方法
Nov 20 Python
python如何实现一个刷网页小程序
Nov 27 Python
Python实现账号密码输错三次即锁定功能简单示例
Mar 29 Python
Python Django 前后端分离 API的方法
Aug 28 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
Feb 25 Python
使用scrapy ImagesPipeline爬取图片资源的示例代码
Sep 28 Python
用python读取xlsx文件
Dec 17 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实现按天数、星期、月份查询的搜索框
2016/05/02 PHP
微信自定义分享php代码分析
2016/11/24 PHP
phpStudy中升级MySQL版本到5.7.17的方法步骤
2017/08/03 PHP
JS之小练习代码
2008/10/12 Javascript
Javascript中Event属性搜集整理
2013/09/17 Javascript
JavaScript bold方法入门实例(把指定文字显示为粗体)
2014/10/17 Javascript
jQuery结合CSS制作漂亮的select下拉菜单
2015/05/03 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
2016/08/29 Javascript
JS实现仿饿了么在浏览器标签页失去焦点时网页Title改变
2017/06/01 Javascript
nodejs创建简易web服务器与文件读写的实例
2017/09/07 NodeJs
Node.js搭建小程序后台服务
2018/01/03 Javascript
javascript少儿编程关于返回值的函数内容
2018/05/27 Javascript
微信小程序登录换取token的教程
2018/05/31 Javascript
详解Vue 动态组件与全局事件绑定总结
2018/11/11 Javascript
微信小程序页面缩放式侧滑效果的实现代码
2018/11/15 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
2019/08/28 Javascript
基于vue项目设置resolves.alias: '@'路径并适配webstorm
2020/12/02 Vue.js
[08:44]DOTA2发布会群星聚首 我们都是刀塔人
2014/03/21 DOTA
[01:02:02]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第二局
2016/02/25 DOTA
Python 中 list 的各项操作技巧
2017/04/13 Python
对Python中DataFrame按照行遍历的方法
2018/04/08 Python
Python3随机漫步生成数据并绘制
2018/08/27 Python
对python插入数据库和生成插入sql的示例讲解
2018/11/14 Python
python学生管理系统
2019/01/30 Python
python2 中 unicode 和 str 之间的转换及与python3 str 的区别
2019/07/25 Python
python opencv 实现对图像边缘扩充
2020/01/19 Python
HTML5所有标签汇总及标签意义解释
2015/03/12 HTML / CSS
美国顶级水上运动专业店:Marine Products
2018/04/15 全球购物
加州风格的游泳和沙滩装品牌:Cupshe
2019/06/10 全球购物
团支部推优材料
2014/05/21 职场文书
2014年电厂个人工作总结
2014/11/27 职场文书
2015年司法局工作总结
2015/05/22 职场文书
聘任书范文大全
2015/09/21 职场文书
毕业欢送晚会主持词
2019/06/25 职场文书
Go语言 go程释放操作(退出/销毁)
2021/04/30 Golang
详解PyTorch模型保存与加载
2022/04/28 Python