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程序的循环的运行效率的原因
Apr 01 Python
Python列出一个文件夹及其子目录的所有文件
Jun 30 Python
利用Python如何将数据写到CSV文件中
Jun 05 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
Jul 31 Python
python3通过selenium爬虫获取到dj商品的实例代码
Apr 25 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
Jul 26 Python
pytorch实现用Resnet提取特征并保存为txt文件的方法
Aug 20 Python
TensorFlow 多元函数的极值实例
Feb 10 Python
python3.7调试的实例方法
Jul 21 Python
利用Python实现Json序列化库的方法步骤
Sep 09 Python
利用python进行数据加载
Jun 20 Python
python index() 与 rindex() 方法的使用示例详解
Dec 24 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实例分享判断客户端是否使用代理服务器及其匿名级别
2014/06/04 PHP
wampserver改变默认网站目录的办法
2015/08/05 PHP
thinkphp如何获取客户端IP
2015/11/03 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
Linux下 php7安装redis的方法
2018/11/01 PHP
你可能不再需要JQUERY
2021/03/09 Javascript
jquery 锁定弹出层实现代码
2010/02/23 Javascript
javascript判断并获取注册表中可信任站点的方法
2015/06/01 Javascript
前端jquery部分很精彩
2016/05/03 Javascript
javascript之IE版本检测超简单方法
2016/08/20 Javascript
简单实现JavaScript图片切换效果
2016/11/28 Javascript
jQuery Ajax全解析
2017/02/13 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
jQuery 循环遍历改变a标签的href(实例讲解)
2017/07/12 jQuery
Angularjs cookie 操作实例详解
2017/09/27 Javascript
JS实现的文件拖拽上传功能示例
2018/05/21 Javascript
微信小程序使用npm支持踩坑
2018/11/07 Javascript
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
JavaScript实现猜数字游戏
2020/05/20 Javascript
小程序Scroll-view上拉滚动刷新数据
2020/06/21 Javascript
Vue切换div显示隐藏,多选,单选代码解析
2020/07/14 Javascript
解决vue 给window添加和移除resize事件遇到的坑
2020/07/21 Javascript
[01:20:37]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python多线程原理与用法实例剖析
2019/01/22 Python
Python基础之循环语句用法示例【for、while循环】
2019/03/23 Python
Python 3 实现定义跨模块的全局变量和使用教程
2019/07/07 Python
python tkinter GUI绘制,以及点击更新显示图片代码
2020/03/14 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
用 Django 开发一个 Python Web API的方法步骤
2020/12/03 Python
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
护士毕业生自荐信
2014/02/07 职场文书
国际商务英语专业求职信
2014/07/08 职场文书
杜甫草堂导游词
2015/02/03 职场文书
教师求职简历自我评价
2015/03/10 职场文书
python中%格式表达式实例用法
2021/06/18 Python
JVM之方法返回地址详解
2022/02/28 Java/Android