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深入学习之闭包
Aug 31 Python
Python中使用gzip模块压缩文件的简单教程
Apr 08 Python
Python画柱状统计图操作示例【基于matplotlib库】
Jul 04 Python
Python基于opencv调用摄像头获取个人图片的实现方法
Feb 21 Python
Python eval的常见错误封装及利用原理详解
Mar 26 Python
Python3中的最大整数和最大浮点数实例
Jul 09 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
Jul 25 Python
100行Python代码实现每天不同时间段定时给女友发消息
Sep 27 Python
pygame实现俄罗斯方块游戏(AI篇1)
Oct 29 Python
Python爬取爱奇艺电影信息代码实例
Nov 26 Python
学会迭代器设计模式,帮你大幅提升python性能
Jan 03 Python
Anaconda配置各版本Pytorch的实现
Aug 07 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&amp;&amp;mysql)一
2006/10/09 PHP
MYSQL 小技巧 -- LAST_INSERT_ID
2009/11/24 PHP
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
PHP中检索字符串的方法分析【strstr与substr_count方法】
2017/02/17 PHP
JQuery的$和其它JS发生冲突的快速解决方法
2014/01/24 Javascript
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
2014/06/11 Javascript
JS判断客服QQ号在线还是离线状态的方法
2015/01/13 Javascript
javascript实现汉字转拼音代码分享
2015/04/20 Javascript
wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析
2015/05/06 Javascript
Jquery zTree 树控件异步加载操作
2016/02/25 Javascript
javascript时间排序算法实现活动秒杀倒计时效果
2021/01/28 Javascript
JS实现图文并茂的tab选项卡效果示例【附demo源码下载】
2016/09/21 Javascript
jQuery多选框选择数量限制方法
2017/02/08 Javascript
vue.js删除动态绑定的radio的指定项
2017/06/02 Javascript
JS实现的JSON数组去重算法示例
2018/04/11 Javascript
node实现分片下载的示例代码
2018/10/17 Javascript
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
2019/02/27 jQuery
vue父组件给子组件的组件传值provide inject的方法
2019/10/23 Javascript
js实现简单的点名器随机色实例代码
2020/09/20 Javascript
用webAPI实现图片放大镜效果
2020/11/23 Javascript
使用python BeautifulSoup库抓取58手机维修信息
2013/11/21 Python
以windows service方式运行Python程序的方法
2015/06/03 Python
Python黑魔法Descriptor描述符的实例解析
2016/06/02 Python
Django返回json数据用法示例
2016/09/18 Python
opencv python 图像去噪的实现方法
2018/08/31 Python
python实现五子棋小游戏
2020/03/25 Python
在python tkinter中Canvas实现进度条显示的方法
2019/06/14 Python
Django之使用celery和NGINX生成静态页面实现性能优化
2019/10/08 Python
dpn网络的pytorch实现方式
2020/01/14 Python
个人自我鉴定怎么写
2013/10/28 职场文书
国际贸易个人求职信范文
2014/01/04 职场文书
大学四年个人的自我评价
2014/02/26 职场文书
2015年销售部工作总结范文
2015/04/27 职场文书
2016春节放假通知范文
2015/08/18 职场文书
golang内置函数len的小技巧
2021/07/25 Golang
yyds什么意思?90后已经听不懂00后讲话了……
2022/02/03 杂记