django—中间件

1、什么是中间件

官方解释:

中间件是一个用来处理Django的请求和响应的框架级别的钩子。是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。。每个中间件 组件都负责一些特定功能

由于影响全局,所以需要谨慎使用,使用不当会影响性能


settings.py中的中间件配置

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

2、自定义中间件

2.1 五个方法

中间件可以定义五个方法,分别是:

'''
所有的方法都有两个特点:
1、返回值为None,继续按照django中定义的规则向后继续执行
2、返回值为HttpResponse对象,直接将该对象返回给用户,不再执行之后的程序
'''

process_request(self,request)
	'''
	1、请求来的时候,按照settings配置文件中从上往下的顺序,依次执行每一个中间件内部定义的process_request方法,如果中间件内部没有该方法,就执行下一个中间件
	2、当返回HttpResponse对象,将这个对象作为中间件里的process_respnse的response传入,并调用process_respnse
	'''
    
process_respnse(self, request, response)
	'''
	1、响应走的时候会按照settings配置文件中从下往上的顺序 依次执行每一个中间件内部定义的process_response方法
	2、必须有两个参数,并且必须返回response形参,不反悔直接报错
	3、该方法返回什么(HttpResponsed对象) 前端就能获得什么
	4、response就是后端返回给前端的数据
	'''
process_view(self, request, view_fun, *args, **kwargs)
	'''
	1.路由匹配成功之后执行视图函数之前触发
	2.如果该方法返回了HttpResponse对象 那么会从下往上一次经过每一个中间件里面的process_response方法	
	'''

process_template_response(self, request, response)
	'''
	1.当你返回的对象中含有render属性指向的是一个render方法的时候才会触发
	2、从下往上的顺序
	'''
    def mdzz(request):
        print('我是视图函数mdzz')

        def render():
            return HttpResponse('你好呀 我是奇葩')

        obj = HttpResponse('我很好 好的像个傻逼一样')
        obj.render = render
        return obj
    
    
process_exception(self, request, exception)
	'''
	1.当视图函数中出现错误 会自动触发  顺序是从下往上
	'''

2.2 简单模拟+登陆验证

示例:简单模拟+登陆验证(cookie/session)

#  实现登陆验证
#  验证不通过,再登陆后,跳转到原来想要访问的url
#  联合process_request和process_response方法,实现此功能

1、先创建一个文件夹,命名为middleware,与应用文件夹同目录

2、在该文件夹内创建py文件,在其中定义中间件类

3、在settings.py文件中的中间件配置列表中,添加我的中间件类

# my_middleware.py
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse,render,redirect

# 中间件类1
class MyMdd1(MiddlewareMixin):
    def process_request(self, request):
        next_url = request.get_full_path()
        print(next_url)
        if next_url.startswith('/app01/login/'):
            return None

        print(request.session.get('username'))
        if request.session.get('username'):
            return None
        else:
            return redirect('/app01/login/%s/' % next_url)

    def process_response(self, request, response):
        s = 'MD1的process_response'
        print(response)
        print(s)
        return response

    def process_view(self, request, view_name, *args, **kwargs):
        s = 'MD1的process_view'
        print(view_name)
        print(args)
        print(kwargs)
        print(s)
        return HttpResponse(s)

    def process_exception(self, request, exception):
        s = 'MD1的process_exception'
        print(exception)
        print(s)
        return HttpResponse(s)

    def process_template_response(self, request, response):
        s = 'MD1的process_template_response'
        print(response)
        print(s)
        return HttpResponse(s)

posted @ 2019-12-04 22:29  W文敏W  阅读(173)  评论(0编辑  收藏  举报