【Django中间价】项目中常用中间件

原文作者:我辈李想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。


文章目录

  • 前言
  • 一、常见用法
  • 二、JWT中间价
  • 三、操作日志中间件
    • 1.在user的app下建立models类
    • 2.如图位置新建LogMiddleware.py
    • 3.django中添加中间件
  • 四、全局异常中间件
    • 1.新建Exception.py文件
    • 2.django配置添加异常中间件


前言

通俗来说,中间件存在于系统开发中,目前有2种,一种是作用于前端和后端之间,一种是作用于后端系统中的,这里说的中间件是django后端。django的前后端分离项目和前后端不分离项目都使用到中间件。


一、常见用法

二、JWT中间价

三、操作日志中间件

这个是参考网络上的文章,进行少量修改。
在这里插入图片描述

1.在user的app下建立models类


class OpLogs(models.Model):
    """操作日志"""

    id = models.AutoField(primary_key=True)
    re_time = models.CharField(max_length=32, verbose_name='请求时间')
    re_user = models.CharField(max_length=32, verbose_name='操作人')
    re_ip = models.CharField(max_length=32, verbose_name='请求IP')
    re_url = models.CharField(max_length=255, verbose_name='请求url')
    re_method = models.CharField(max_length=11, verbose_name='请求方法')
    re_content = models.TextField(null=True, verbose_name='请求参数')
    rp_content = models.TextField(null=True, verbose_name='响应参数')
    access_time = models.IntegerField(verbose_name='响应耗时/ms')

    class Meta:
        verbose_name = '操作日志'
        verbose_name_plural = '操作日志'
        db_table = 'operate_logs'

2.如图位置新建LogMiddleware.py

# -*- coding:utf-8 _*-
"""
@author:lenovo
@file: LogMiddleware.py
@time: 2023/3/17  17:41
"""
import time
import json

from django.utils.deprecation import MiddlewareMixin

from user.models import OpLogs


class OpLog(MiddlewareMixin):
    __exclude_urls = ['index/', ]  # 定义不需要记录日志的url名单

    def __init__(self, *args):
        super(OpLog, self).__init__(*args)

        self.start_time = None  # 开始时间
        self.end_time = None  # 响应时间
        self.data = {}  # dict数据

    def process_request(self, request):
        """
        请求进入
        :param request: 请求对象
        :return:
        """

        self.start_time = time.time()  # 开始时间
        re_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())  # 请求时间(北京)

        # 请求IP
        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            # 如果有代理,获取真实IP
            re_ip = x_forwarded_for.split(",")[0]
        else:
            re_ip = request.META.get('REMOTE_ADDR')

        # 请求方法
        re_method = request.method

        # 请求参数
        re_content = request.GET if re_method == 'GET' else request.POST
        if re_content:
            re_content = json.dumps(re_content)
        else:
            re_content = None

        self.data.update(
            {
                're_time': re_time,  # 请求时间
                're_url': request.path,  # 请求url
                're_method': re_method,  # 请求方法
                're_ip': re_ip,  # 请求IP
                're_content': re_content,  # 请求参数
            }
        )

    def process_response(self, request, response):
        """
        响应返回
        :param request: 请求对象
        :param response: 响应对象
        :return: response
        """
        # 请求url在 exclude_urls中,直接return,不保存操作日志记录
        for url in self.__exclude_urls:
            if url in self.data.get('re_url'):
                return response

        if response.get('accepted_media_type') == 'application/json':
            # 获取响应数据字符串(多用于API, 返回JSON字符串)
            rp_content = response.content.decode()
        else:
            rp_content = '不是json数据'
        self.data['rp_content'] = rp_content
        self.data['re_user'] = request.user.username if request.user else 'AnonymousUser'  # 操作人(需修改),网站登录用户

        # 耗时
        self.end_time = time.time()  # 响应时间
        access_time = self.end_time - self.start_time
        self.data['access_time'] = round(access_time * 1000)  # 耗时毫秒/ms
        OpLogs.objects.create(**self.data)  # 操作日志入库db

        return response

3.django中添加中间件

在这里插入图片描述

MIDDLEWARE = [
    "corsheaders.middleware.CorsMiddleware",
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'utils.jwt1.JwtAuthorizationMiddleware',  # 通过Authorization请求头传递token
    'utils.middlewares.LogMiddleware.OpLog',  # 操作日志
    'utils.middlewares.Exception.AllException'  # 全局异常
]

四、全局异常中间件

在这里插入图片描述

1.新建Exception.py文件

# -*- coding:utf-8 _*-
"""
@author:lenovo
@file: Exception.py.py
@time: 2023/4/23  18:20
"""
import logging

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

logger = logging.getLogger("app")


class AllException(MiddlewareMixin):
    def process_exception(self, request, exception):
        """
        视图函数报错后
        :param request: 请求对象
        :return:
        """
        print(exception)
        logger.error(exception)
        ex_data = {
            "msg": "Sorry, we make a mistake (* ̄︶ ̄)!",
            "code": 1000,
            "request": request.path,
            'data': []
        }
        return JsonResponse(data=ex_data, status=500)

2.django配置添加异常中间件

在这里插入图片描述

MIDDLEWARE = [
    "corsheaders.middleware.CorsMiddleware",
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'utils.jwt1.JwtAuthorizationMiddleware',  # 通过Authorization请求头传递token
    'utils.middlewares.LogMiddleware.OpLog',  # 操作日志
    'utils.middlewares.Exception.AllException'  # 全局异常
]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/241121.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pandas缺失数据处理

好多数据集都含缺失数据,缺失数据有多重表现形式 数据库中,缺失数据表示为NULL 在某些编程语言中用NA表示 缺失值也可能是空字符串(’’)或数值 在Pandas中使用NaN表示缺失值; NaN简介 Pandas中的NaN值来自NumPy库&a…

IPQ6010 vs IPQ8072 What’s the difference?|802.11AX WiFi6 Solution DR6018 DR8072

IPQ6010 vs IPQ8072 What’s the difference?|802.11AX WiFi6 Solution DR6018 DR8072 IPQ6010 vs IPQ8072: In-Depth Comparison and Selection Guide The rapid evolution of networking technologies has driven continuous innovation in routers and network devices. Am…

msvcp80.dll文件丢失怎么恢复?详解多种DLL文件修复方法

本文将为您详细介绍msvcp80.dll的定义、作用以及丢失的原因,并提供5个解决方法,帮助您解决这一问题。 一、msvcp80.dll是什么? msvcp80.dll是Microsoft Visual C Runtime Library中的一个动态链接库文件,它包含了许多C运行库函数…

SIM卡内部结构及外部物理接口

1. 内部组成 “SIM卡”是一个装有微处理器的芯片卡,它的内部有5个模块:1.微处理器CPU:控制SIM卡的运算和操作2.程序存储器ROM:存放片内操作系统,用户不可操作。3.工作存储器RAM:存放计算过程中的临时数据4…

Video anomaly detection with spatio-temporal dissociation 论文阅读

Video anomaly detection with spatio-temporal dissociation 摘要1.介绍2.相关工作3. Methods3.1. Overview3.2. Spatial autoencoder3.3. Motion autoencoder3.4. Variance attention module3.5. Clustering3.6. The training objective function 4. Experiments5. Conclusio…

基于Dockerfile创建镜像

Docker镜像的创建 1.基于现有镜像创建 //首先启动一个镜像,在容器里做修改 docker run -itd --name web centos:7 /bin/bash #启动容器docker exec -it web bash #进入容器​ yum install -y epel-release #安装epel源 yum install -y nginx #安装nginx …

共享门店会在未来新零售占据主角吗?

共享门店作为一种创新的商业模式,在未来新零售领域中可能会占据一定的角色,但具体是否会成为主角,还需要根据市场的发展和技术的进步来判断。 首先,共享门店模式通过资源共享、风险共担、客户共享和收益共享等方式,为…

Python 递归及目录遍历

递归调用:一个函数,调用了自身,称为递归调用 递归函数:一个会调用自身的函数 凡是循环能做的事,递归都能做。 目录 递归示例 普通方法实现 递归方式实现 计算分析: 递归遍历目录 引入os 遍历目录 执…

Unity | 渡鸦避难所-2 | 搭建场景并添加碰撞器

1 规范项目结构 上期中在导入一系列的商店资源包后,Assets 目录已经变的混乱不堪 开发过程中,随着资源不断更新,遵循一定的项目结构和设计规范是非常必要的。这可以增加项目的可读性、维护性、扩展性以及提高团队协作效率 这里先做下简单的…

【BigDecimal类—常用API系列】解决java浮点计算精度损失问题

文章目录 Java浮点计算精度损失问题BigDecimal进行精确运算的解决方案 Java浮点计算精度损失问题 BigDecimal它是干什么用的呢?什么是java浮点计算精度损失问题?我们先看一段代码,看这个代码有什么问题?再说BigDeimal这个类是干什…

【机器学习】亚马逊云科技基础知识:以推荐系统为例。你知道机器学习的关键所在么?| 机器学习管道的各个阶段及工作:以Amazon呼叫中心转接问题为例讲解

有的时候,暂时的失利比暂时胜利要好得多。 ————经典网剧《mao pian》,邵半仙儿 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客之星人工智能领域TOP

深入了解—C++11特性

目录 一、 C11简介 二、初始化列表 2.1 C98中{}的初始化问题 2.2 内置类型的列表初始化 2.3 自定义类型的列表初始化 2.3.1. 标准库支持单个对象的列表初始化 2.3.2. 多个对象的列表初始化 三、变量类型推导 3.1 为什么需要类型推导 3.2 decltype类型推导 3.2.1. 推…

方法-PC端远程调试分布式训练

本专栏为深度学习的一些技巧,方法和实验测试,偏向于实际应用,后续不断更新,感兴趣童鞋可关,方便后续推送 简介 一些简单的代码我们使用Pycharm本地调试就能运行成功,但在诸如使用GPU进行分布式训练和推断等场景中,由于我们本地的电脑没有GPU或者没有多…

慢SQL的治理经验

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、慢SQL导致的后果 二、可能导致慢SQL的原因 三、如何发现慢SQL 3.1 JVM Sandbox 四、识别高危SQL 4.1 阿里的重点强制SQL规…

docker容器-compose单机容器编排

yaml文件:是一种标记语言,以竖列的形式展示序列化的数据格式,可读性高 类似于json格式,语法简单 yaml通过缩进来表示数据结构,连续的项目用-减号来表示 yaml文件使用的注意事项 1、大小写敏感 2、通过缩进表示层级…

VUE3语法--toRefs与toRef用法

1、功能概述 ref和reactive能够定义响应式的数据,当我们通过reactive定义了一个对象或者数组数据的时候,如果我们只希望这个对象或者数组中指定的数据响应,其他的不响应。这个时候我们就可以使用toRefs和toRef实现局部数据的响应。 toRefs是…

AntDB数据库致力降本增效的某省高速清分结算实践——优势总结和推广意义

中国正处于数字化转型的关键时期,高速公路正朝着智慧高速的建设迈进。不论是传统的传统高速卡口,诸如“数据采集、数据上传”和“数据处理”的基础建设1.0时代,还是不久将来即将实现的具备“车辆协同智能”、“边缘控制中心”及“智慧高速云控…

vue+element项目中页面多个接口异常,只提示一次异常信息

有时候一个页面会同时调多个接口,但是多个接口异常,需要做提示,那么提示的时候会弹出很多的提示信息,这无疑让体验感降低很多。 所以针对这种情况,我们配合element UI统一做一个异常状态的处理,只能显示一…

MATLAB实现图像变换和滤波

MATLAB实现图像变换和滤波方法对具有不同特征的灰度图像进行处理 图像变换方法包括:DFT及IDFT,DCT及IDCT 图像滤波方法包括低通滤波和高通滤波 图像变换 DFT/IDFT 图像一般是二维的,根据二维离散傅里叶变换公式DFT,可以将图片…