37 django中间件

 

 

django中间件是django的门户

请求来的时候需要先经过中间件才能到达真正的django后端
响应走的时候最后也需要经过中间件才能发送出去

当我们需要给web后端添加一些全局相关的功能时可以使用中间件
1.校验每个用户的访问频率
2.校验每个用户的登录状态
3.用户黑名单、白名单
4.用户权限

1 django自带七个中间件

django.middleware.security.SecurityMiddleware 相当于 from django.middleware.security import SecurityMiddleware
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',
]

CommonMiddleware中间件控制了是否重定向到带/的地址

 

 

 

 

2 每个中间件基本都有process_request和process_response方法

class SessionMiddleware(MiddlewareMixin):
    def process_request(self, request):
        session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME)
        request.session = self.SessionStore(session_key)
    def process_response(self, request, response):
        return response
      
class CsrfViewMiddleware(MiddlewareMixin):
      def process_request(self, request):
        csrf_token = self._get_token(request)
        if csrf_token is not None:
            # Use same token next time.
            request.META['CSRF_COOKIE'] = csrf_token
    def process_view(self, request, callback, callback_args, callback_kwargs):
        return self._accept(request)

    def process_response(self, request, response):
        return response
      
class AuthenticationMiddleware(MiddlewareMixin):
    def process_request(self, request):
        request.user = SimpleLazyObject(lambda: get_user(request))

3.django支持自定义中间件

有五个可以自定义的方法:

1.必须掌握
process_request
process_response
2.了解即可
process_view
process_template_response
process_exception

4 如何自定义中间件

1.在项目名或者应用名下创建一个任意名称的文件夹
2.在该文件夹内创建一个任意名称的py文件
3.在该py文件内需要书写类(这个类必须继承MiddlewareMixin)
然后在这个类里面就可以自定义五个方法了
(这五个方法并不是全部都需要书写,用几个写几个)
4.需要将类的路径以字符串的形式注册到配置文件中才能生效
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',
    '你自己写的中间件的路径1',
    '你自己写的中间件的路径2',
    '你自己写的中间件的路径3',
]

4.1 process_request


process_request(self,request)
1.当请求来的时候会从上往下依次执行每一个中间件里面的该方法
如果没有则直接下一个
2.当该方法返回了HttpResponse对象 那么请求不再继续往后执行
而是直接原路返回

process_request方法就是用来做全局相关的所有限制功能

自定义中间件:

1、在app01下创建mymiddle文件夹
2、在mymiddle下创建mydd.py文件
3、书写类(这个类必须继承MiddlewareMixin)
from django.utils.deprecation import MiddlewareMixin
class MyMiddleware1(MiddlewareMixin):
    def process_request(self, request):
        print('中间件1里的process_request')


class MyMiddleware2(MiddlewareMixin):
    def process_request(self, request):
        print('中间件2里的process_request')

 views.py

def my_dd(request):
    print('view里的')

    return HttpResponse('hello')

4.2 process_response

process_response(self,request,response)
            1.当响应返回的时候会从下往上依次执行每一个中间件里面的该方法
            如果没有则直接下一个 该方法默认要返回response,你也可以返回自己的
            2.该方法返回什么浏览器就会接收到什么(也就意味着我们可以中途拦截待返回的数据做其他处理)
该方法有两个额外的参数request,response
class MyMiddleware1(MiddlewareMixin):
    def process_request(self, request):
        print('中间件1里的process_request')
        # return HttpResponse('666')

    def process_response(self, request, response):
        print('中间件1里的process_response')

        return response

class MyMiddleware2(MiddlewareMixin):
    def process_request(self, request):
        print('中间件2里的process_request')

    def process_response(self, request, response):
        print('中间件2里的process_response')

        return response

 

 

研究如果在第一个process_request方法就已经返回了HttpResponse对象,那么响应走的时候是经过所有的中间件里面的process_response还是有其他情况?

答:会直接走同级别的process_reponse返回

 

4.3 process_view

process_view(self, request, view_func, view_args, view_kwargs)

该方法有四个参数

request是HttpRequest对象。

view_func是Django即将使用的视图函数。 (它是实际的函数对象,而不是函数的名称作为字符串。)

view_args是将传递给视图的位置参数的列表.

view_kwargs是将传递给视图的关键字参数的字典。 view_args和view_kwargs都不包含第一个视图参数(request)。


路由匹配成功之后执行视图函数之前,会自动执行中间件里面的该放法 顺序是按照配置文件中注册的中间件从上往下的顺序依次执行

4.4 process_template_response(用的比较少)

process_template_response(self, request, response)
返回的HttpResponse对象有render属性的时候才会触发 顺序是按照配置文件中注册了的中间件从下往上依次经过

 

 

4.5 process_exception

process_exception(self, request, exception)

该方法两个参数:

一个HttpRequest对象

一个exception是视图函数异常产生的Exception对象。


当视图函数中出现异常的情况下触发 顺序是按照配置文件中注册了的中间件从下往上依次经过

 

 

posted @ 2021-12-06 20:02  甜甜de微笑  阅读(25)  评论(0编辑  收藏  举报