前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django 中间件,自定义中间件(有代码,拿上就可以用)

Django 中间件,自定义中间件(有代码,拿上就可以用)

作者头像
一写代码就开心
发布2022-06-06 08:03:54
7380
发布2022-06-06 08:03:54
举报
文章被收录于专栏:java和python

目录

1 背景

就是在我们的项目里面,多加一段代码,可插拔式的, 一般是配置在setting.py里面,django有很多默认的中间件

在这里插入图片描述
在这里插入图片描述

2 概念

中间件就是对全局的路由进行拦截,就可以理解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3 访问ip限制中间件(案例)

代码语言:javascript
复制
class IpMiddleware(MiddlewareMixin):
    visit_times = {}

    def process_request(self, request):
        # 执行路由之前被调用,返回None就是通过,返回HttpResponse  就是拦截成功
        print("执行路由之前被调用")

        # 获取远程客户端的ip地址
        IPAddr = request.META['REMOTE_ADDR']
        # 获取请求的路由的地址
        pathinfo = request.path_info
        print(IPAddr)  # 127.0.0.1
        print(pathinfo)  # /test/

        if not re.match('^/test',pathinfo):
            #  如果没有匹配到
            return
        # 拿到现在的访问次数
        times = self.visit_times.get(IPAddr,0)

        self.visit_times[IPAddr] = times+1

        if times<5:
            return
        return HttpResponse("您已经访问了"+str(times)+"次,访问被禁止")

4 中间件模板

代码语言:javascript
复制
import re

from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin


# 中间件就是一个类,继承父类MiddlewareMixin,重写最多的5个方法
# 就是你可以重写一个或者多个方法
class IpMiddleware(MiddlewareMixin):
    visit_times = {}

    def process_request(self, request):
        # 执行路由之前被调用,返回None就是通过,返回HttpResponse  就是拦截成功
        print("执行路由之前被调用")

        # 获取远程客户端的ip地址
        IPAddr = request.META['REMOTE_ADDR']
        # 获取请求的路由的地址
        pathinfo = request.path_info
        print(IPAddr)  # 127.0.0.1
        print(pathinfo)  # /test/

        # if not re.match('^/88888',pathinfo):
        #     #  如果没有匹配到
        #     return
        # # 拿到现在的访问次数
        # times = self.visit_times.get(IPAddr,0)
        #
        # self.visit_times[IPAddr] = times+1
        #
        # if times<5:
        #     return
        # return HttpResponse("您已经访问了"+str(times)+"次,访问被禁止")



    def process_view(self, request, view_func, view_func_args, view_func_kwargs):
        # 调用视图函数之前被调用,返回None就是通过,返回HttpResponse  就是拦截成功
        print("调用视图函数之前被调用")
        return None

    def process_response(self, request, response):
        # 所有的响应返回给浏览器之前被调用,返回HttpResponse
        # 一定会走这个逻辑,即使view里面代码错了,先走错的,再走这个

        # 执行路由之前被调用
        # 调用视图函数之前被调用
        # 我出错了
        # 返回给浏览器之前,调用我了
        print("返回给浏览器之前,调用我了")
        return response
    #
    # def process_template_response(self, request, response):
    #     # 很少用
    #     # 只有我们的视图里面返回了render渲染的,才会走这个
    #     print("我走了render函数了")
    #     return None


    def process_exception(self, request, exception):
        # 视图里面出错了,就会自动到这个里面执行,返回HttpResponse
        # 抓异常,发邮件
        print("我出错了")
        return None

写完之后,在setting里面进行注册

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 1 背景
  • 2 概念
  • 3 访问ip限制中间件(案例)
  • 4 中间件模板
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档