赞
踩
原文作者:我辈李想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。
通俗来说,中间件存在于系统开发中,目前有2种,一种是作用于前端和后端之间,一种是作用于后端系统中的,这里说的中间件是django后端。django的前后端分离项目和前后端不分离项目都使用到中间件。
这个是参考网络上的文章,进行少量修改。
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'
# -*- 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
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' # 全局异常
]
# -*- 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)
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' # 全局异常
]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。