资讯专栏INFORMATION COLUMN

5-django——验证码,中间件

alexnevsky / 1950人阅读

验证码

在用户注册、登陆页面为了防止暴力请求,可以加入验证码。如果验证码错误,则不需要继续处理,可以减轻服务器的压力

使用验证码也是一种有效防止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:WindowsFontsAdobeArabic-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 = "

sunck is a good man

" # infoStr = "" 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中间件简单图解

方法

自定义中间件

在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"

6-django——admin站点管理

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41984.html

相关文章

  • 4-django——模板

    摘要:概述定义模板变量要遵守标识符规则语法在模板中使用点语法,按顺序查询字典查询属性或者方法查询数字索引查询如果使用的变量不存在,则插入空字符串在模板中调用对象的方法,但是不能给函数传参示例标签语法作用在输出中创建文本控制逻辑或循环加载外 概述 showImg(https://segmentfault.com/img/bVbdxkI?w=585&h=378); 定义模板 变量 要遵守标识符规...

    yibinnn 评论0 收藏0
  • Django下使用celery 异步发送短信验证

    摘要:介绍应用举例是一个基于开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理,如果你的业务场景中需要用到异步任务,就可以考虑使用你想对台机器执行一条批量命令,可能会花很长时间,但你不想让你的程序等着结果返回,  celery 1.celery介绍 1.1 celery应用举例 Celery 是一个 基于python开发的分布式异步消息任务队列,通过...

    everfly 评论0 收藏0
  • JVM实战---类加载的过程

    任何程序都需要加载到内存才能与CPU进行交流 同理, 字节码.class文件同样需要加载到内存中,才可以实例化类 ClassLoader的使命就是提前加载.class 类文件到内存中 在加载类时,使用的是Parents Delegation Model(溯源委派加载模型) Java的类加载器是一个运行时核心基础设施模块,主要是在启动之初进行类的加载、链接、初始化 showImg(https://s...

    bladefury 评论0 收藏0
  • 一只node爬虫的升级打怪之路

    摘要:我是一个知乎轻微重度用户,之前写了一只爬虫帮我爬取并分析它的数据,我感觉这个过程还是挺有意思,因为这是一个不断给自己创造问题又去解决问题的过程。所以这只爬虫还有登陆知乎搜索题目的功能。 我一直觉得,爬虫是许多web开发人员难以回避的点。我们也应该或多或少的去接触这方面,因为可以从爬虫中学习到web开发中应当掌握的一些基本知识。而且,它还很有趣。 我是一个知乎轻微重度用户,之前写了一只爬...

    shiweifu 评论0 收藏0
  • 一种低成本的找回密token验证方案

    摘要:的特点主要有如下几个唯一性时效性不可预测很多大型业务中,比如说的找回密码流程中,对于发给用户的找回密码链接邮件需要同时提交用户输入的验证码和也就是该校验码对应的。 随着互联网的高速发展,WEB2.0网站的业务越来越庞大,一些token验证在许多场景下都必不可少,比如说交易订单的防止多次提交,重要的敏感操作防止CSRF(跨站请求伪造)攻击,以及短信验证码,找回密码验证码,注册登录图形的生...

    lakeside 评论0 收藏0

发表评论

0条评论

alexnevsky

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<