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 24 Python
简单使用Python自动生成文章
Dec 25 Python
利用python批量修改word文件名的方法示例
Oct 17 Python
python 用lambda函数替换for循环的方法
Jun 09 Python
python使用Paramiko模块实现远程文件拷贝
Apr 30 Python
python实现弹跳小球
May 13 Python
Python代码生成视频的缩略图的实例讲解
Dec 22 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
Mar 03 Python
Python 将 QQ 好友头像生成祝福语的实现代码
May 03 Python
python使用建议与技巧分享(一)
Aug 17 Python
实操Python爬取觅知网素材图片示例
Nov 27 Python
python微信智能AI机器人实现多种支付方式
Apr 12 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 token使用与验证示例【测试可用】
2017/08/30 PHP
php微信开发之谷歌测距
2018/06/14 PHP
PHP parse_ini_file函数的应用与扩展操作示例
2019/01/07 PHP
js window.print实现打印特定控件或内容
2013/09/16 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
Javascript核心读书有感之词法结构
2015/02/01 Javascript
jQuery操作表单常用控件方法小结
2015/03/23 Javascript
不想让浏览器运行javascript脚本的方法
2015/11/20 Javascript
微信小程序实现实时圆形进度条的方法示例
2017/02/24 Javascript
JS优化与惰性载入函数实例分析
2017/04/06 Javascript
Vue 2.0在IE11中打开项目页面空白的问题解决
2017/07/16 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
2018/05/24 jQuery
JavaScript常见JSON操作实例分析
2018/08/08 Javascript
layui 实现table翻页滚动条位置保持不变的例子
2019/09/05 Javascript
Javascript类型判断相关例题及解析
2020/08/26 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
2020/10/18 Javascript
Python如何通过subprocess调用adb命令详解
2017/08/27 Python
python找出完数的方法
2018/11/12 Python
python自动化之Ansible的安装教程
2019/06/13 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
2019/10/12 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
2019/12/13 Python
python利用datetime模块计算程序运行时间问题
2020/02/20 Python
学会python自动收发邮件 代替你问候女友
2020/05/20 Python
python右对齐的实例方法
2020/07/05 Python
python正则表达式re.match()匹配多个字符方法的实现
2021/01/27 Python
美国照明、家居装饰和家具购物网站:Bellacor
2017/09/20 全球购物
匡威荷兰官方网站:Converse荷兰
2018/10/24 全球购物
Foot Locker澳洲官网:美国运动服和鞋类零售商
2019/10/11 全球购物
简历的个人自我评价范文
2014/01/03 职场文书
王力宏牛津大学演讲稿
2014/05/22 职场文书
圆明园纪录片观后感
2015/06/03 职场文书
2015年食品安全宣传周活动总结
2015/07/09 职场文书
网吧管理制度范本
2015/08/05 职场文书
聘任合同书
2015/09/21 职场文书
pandas 操作 Excel操作总结
2021/03/31 Python
利用 Python 的 Pandas和 NumPy 库来清理数据
2022/04/13 Python