Django中间件

​ 之前,使用装饰器实现登陆校验,但是实际上有很多功能是需要所有页面都执行的,比如权限,当不同的用户访问同一个页面,根据权限不同返回的数据也应该不同。首先可以通过数据库查询限制返回的结果,这样的限制并不能完全对信息进行限制。

中间件:是用来处理Django请求的框架级别的钩子,他是一个轻量级的,低级别的插 件系统,用于全局范围改变django的输入与输出。

在这里插入图片描述

​ 如果django项目存在中间件,用户发起请求,请求首先需要经过 【process_request】,【process_views】方法,当视图返回数据的时候,先经过 【process_exception】,【process_template_response】,【process_response】。

上述的五个可以是中间件当中的方法,可以全写,也可以写一部分。

使用中间件

1,在项目主目录定义middleware文件,编写中间件类

#中间件的元类,所有自定义的中间件都是基于当前类型进行重写的
from django.utils.deprecation import MiddlewareMixin
import os
import datetime
from Djangoshop.settings import BASE_DIR
class MiddlewareTest(MiddlewareMixin):
    def process_request(self,request):
        '''
        :param request: 视图没有处理请求
        :return:
        '''
        print('this is process_request')

    def process_view(self,request,view_func,view_args,view_kwargs):
        '''
        :param request: 视图没有处理请求
        :param view_func:视图函数
        :param view_args:视图函数的参数,元组格式
        :param view_kwargs:视图函数的参数,字典格式
        :return:
        '''
        print('this is process_view')

    def process_exception(self,request,exception):
        '''
        :param request:视图处理中的请求
        :param exception: 错误
        :return:
        '''
        # 报错日志
        now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        level = 'Error'
        content = str(exception)
        log_result = '%s [%s] %s'%(now,level,content)
        file_path = os.path.join(BASE_DIR,'error.log')
        with open(file_path,'a') as f:
            f.write(log_result)
        print('this is process_exception')
    def process_template_response(self,request,response):
        '''
        :param request: 视图处理完成的请求
        :param response: 视图处理完的响应
        :return:
        '''
        print('this is process_template_response')
        return response

    def process_response(self,request,response):
        '''
        :param request: 视图处理完成的请求
        :param response: 视图处理完的响应
        :return:
        '''
        response.set_cookie('hhh','111')
        print('this is process_response')
        return response

2,在settings当中进行配置安装

在这里插入图片描述

中间件的配置是一个列表,中间件的加载和使用是有顺序的。

在这里插入图片描述

请求是自动触发的中间件

【process_request】【process_views】【process_response】。

process_request方法

Process_request 只有一个参数,是请求,这个请求的request和视图的request是一模一样的。但是在process_request当中编写代码可以影响到视图当中的request。

在这里插入图片描述

process_views方法

Process_view 拥有四个参数:

Request 是一个httpRequest对象

View_func django 即将使用的视图函数

View_args 视图函数元组参数

View_kwargs 视图函数的字典参数

无论是view_args还是view_kwargs都不会包含request

在这里插入图片描述
对比上述内容:

1、process_request 在 process_view之前执行

2、Process_request只接受request对象,process_view接受request对象和视图函 数及参数

process_exception方法

Process_exception方法只有在视图函数当中发生错误才会执行。

参数:Request 请求对象,,Exception 错误。

在这里插入图片描述

在这里插入图片描述

记录错误

在这里插入图片描述

process_template_response方法

当前方法只有在视图函数当中返回一个render对象才会执行,通常不会被使用。如果被使用,一定要返回一个response对象

当视图函数当中返回有render对象(或者是其他等价的response对象),改方法只会返回render对象返回的内容。

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

process_response方法

Process_response是中间件执行最后的方法,通常用于对响应内容进行再次处理,但是必须返回一个response对象。

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值