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根据给定文件返回文件名和扩展名的方法
Mar 27 Python
python使用matplotlib绘图时图例显示问题的解决
Apr 27 Python
10分钟教你用Python实现微信自动回复功能
Nov 28 Python
python的依赖管理的实现
May 14 Python
对Python3之方法的覆盖与super函数详解
Jun 26 Python
如何运行.ipynb文件的图文讲解
Jun 27 Python
python使用Pandas库提升项目的运行速度过程详解
Jul 12 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
Jul 23 Python
python使用matplotlib绘制雷达图
Oct 18 Python
python模拟点击在ios中实现的实例讲解
Nov 26 Python
Python实现钉钉/企业微信自动打卡的示例代码
Feb 02 Python
python图像处理 PIL Image操作实例
Apr 09 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中的CMS的涵义
2007/03/11 PHP
微信API接口大全
2015/04/15 PHP
PHP7新特性foreach 修改示例介绍
2016/08/26 PHP
php实现微信支付之退款功能
2018/05/30 PHP
Javascript Tab 导航插件 (23个)
2009/06/11 Javascript
js监听输入框值的即时变化onpropertychange、oninput
2011/07/13 Javascript
jQuery中bind与live的用法及区别小结
2014/01/27 Javascript
理解jQuery stop()方法
2014/11/21 Javascript
JavaScript调试工具汇总
2014/12/23 Javascript
jquery插件splitScren实现页面分屏切换模板特效
2015/06/16 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
JS实现HTML表格排序功能
2016/08/05 Javascript
js控住DOM实现发布微博效果
2016/08/30 Javascript
Js自定义多选框效果的实例代码
2017/07/05 Javascript
Angular.js中$resource高大上的数据交互详解
2017/07/30 Javascript
前端Electron新手入门教程详解
2019/06/21 Javascript
使用 Jest 和 Supertest 进行接口端点测试实例详解
2020/04/25 Javascript
详解Vue的异步更新实现原理
2020/12/22 Vue.js
[45:25]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
Python查询阿里巴巴关键字排名的方法
2015/07/08 Python
利用Python获取赶集网招聘信息前篇
2016/04/18 Python
利用python将图片转换成excel文档格式
2017/12/30 Python
Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
2018/01/15 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
2018/10/22 Python
Python flask框架post接口调用示例
2019/07/03 Python
python梯度下降算法的实现
2020/02/24 Python
Python列表如何更新值
2020/05/27 Python
套娃式文件夹如何通过Python批量处理
2020/08/23 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
维多利亚的秘密官方旗舰店:VICTORIA’S SECRET
2018/04/02 全球购物
英国在线药房:Express Chemist
2019/03/28 全球购物
美国林业供应商:Forestry Suppliers
2019/05/01 全球购物
致全体运动员广播稿
2014/02/01 职场文书
秋季运动会广播稿大全
2014/02/17 职场文书
小学师德师风整改措施
2014/10/27 职场文书
新入职员工工作总结
2015/10/15 职场文书