sponsored links

python Django中间件的使用,原理 和实际应用

创建中间件

MIDDLEWARE = [
    # 自定义 在 对应app内创建一个 my_middleware.py 然后路径填写进来即可
]

常用两中间件process_request & process_response

from django.utils.deprecation import MiddlewareMixin
# 导入中间件模块

class MD1(MiddlewareMixin):

    # 接收到客户端信息后立即执行(视图函数之前)
    def process_request(self, request):
        print("MD1里面的 process_request")
    # 返回到客户端信息前最后执行(视图函数之后)
    def process_response(self, request, response):
        print("MD1里面的 process_response")
        return response

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)。
'''

process_exception
视图函数出错时执行

process_exception(self, request, exception)

该方法两个参数:

一个HttpRequest对象

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

应用场景

  1. 做IP访问频率限制
  2. URL访问过滤(没登陆就要登陆才能访问)
    如果用户访问login则放过,其他也没检测是不是有session,已经有了放过,没有放回login

实例(访问过滤)

setting.py

MIDDLEWARE = [
    # 自定义 在 对应app内创建一个 my_middleware.py 然后路径填写进来即可
    'app01.my_middleware.AuthMiddleware',
    ]

# 白名单路径,不需要做登陆就能访问的页面
WHITE_LIST = ['/login/', '/reg/', '/logout/']

my_middleware.py

from django.utils.deprecation import MiddlewareMixin  # 导入中间间模块
from django.shortcuts import redirect  # 返回页面模块
from middlewareDemo import settings  # 导入白名单


class AuthMiddleware(MiddlewareMixin):  # 认证中间件

    def process_request(self, request):

        white_list = settings.WHITE_LIST

        if request.path in white_list:
            return None  # 如果是白名单的路径,直接跳过
        if not request.user.is_authenticated:  # 获取用户是否登陆
            return redirect('/login/')
Tags: