中间件 1 什么是中间件 2 自定义中间件 3 中间件执行流程 4 csrf跨站请求伪造

'''
定义:中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。
说的直白一些,中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。
'''

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',
]
# django框架请求生命周期流程图

中间件
1 什么是中间件
2 自定义中间件
3 中间件执行流程
4 csrf跨站请求伪造

2 自定义中间件

1 自定义中间件步骤

# 中间件可以定义五个方法,分别是:
(1)process_request(self,request)
(2)process_response(self,request,response)
(3)process_view(self, request, view_func, view_args, view_kwargs)
(4)process_template_response(self,request,response)
(5)process_exception(self, request, exception)

1 在项目名或者应用名下,创建一个任意名称的文件夹,如mymiddleware;

2 在该文件夹下创建一个任意名称的 py文件,如auths.py;

3 在该py文件内书写类,这个类必须继承MiddlewareMixin;

4 需要将类的路径以字符串的形式注册到配置文件中才能生效

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    ...

    # 自定义的中间件
    'app01.mymiddleware.auths.Login',
    'app01.mymiddleware.auths.Register',
]

2 process_request

"""
process_request有一个参数,就是request,这个request和视图函数中的request是一样的(在交给Django后面的路由之前,对这个request对象可以进行一系列的操作)。

由于request对象是一样的,所以我们可以对request对象进行一系列的操作,包括request.变量名=变量值,这样的操作,我们可以在后续的视图函数中通过相同的方式即可获取到我们在中间件中设置的值。
"""

auths.py

from django.utils.deprecation import MiddlewareMixin


class Login(MiddlewareMixin):
    def process_request(self, request):
        print('login里面的process_request!')


class Register(MiddlewareMixin):
    def process_request(self, request):
        print('register里面的process_request!')

view.py

def index(request):
    print('我是app01的index函数')
    return render(request,'index.html',{'msg':'你是我小宝贝'})

中间件
1 什么是中间件
2 自定义中间件
3 中间件执行流程
4 csrf跨站请求伪造

3 process_reponse

"""
定义process_response方法时,必须给方法传入两个形参(request和response)。request就是上述例子中一样的对象,
response是视图函数返回的HttpResponse对象(也就是说这是Django后台处理完之后给出一个的一个具体的视图)。该方法的返回值(必须要有返回值)也必须是HttpResponse对象。
如果不返回response而返回其他对象,则浏览器不会拿到Django后台给他的视图,而是我的中间件中返回的对象。
"""

auths.py

class Login(MiddlewareMixin):
    def process_request(self, request):
        print('我是login函数的process_request!')

    def process_response(self, request, response):
        print('我是login函数的process_response!')
        return response


class Register(MiddlewareMixin):
    def process_request(self, request):
        print('我是register函数的process_request!')

    def process_response(self, request, response):
        print('我是register函数的process_request!')
        return response

总结

(1)中间件的process_response方法是在执行视图函数之后执行的;
(2)当配置多个中间件时,会按照MIDDLEWARE中的注册顺序倒序执行,也就是说:第一个中间件的process_request方法首先执行,而它的process_response方法最后执行,最后一个中间件的process_request方法最后执行,而它的process_response方法首先执行;
(3)process_response方法,有两个参数(request,response),该方法必须返回一个HttpResponse对象,默认是返回的形参(response,你也可以返回自己定义的HttpResponse对象);
(4)如果某个中间件中没有process_response方法,则跳过继续执行下一个中间件;

4 process_view

5 process_exception

3 中间件执行流程

4 csrf跨站请求伪造

1 form表单csrf跨站请求伪造校验

2 ajax csrf跨站请求伪造校验

3 csrf相关装饰器