简介
Django的中间件是处理Django的request和response对象的钩子
- request:用户向网站发送请求
- response: 网页根据用户操作返回相应内容
Django中间件执行
- 中间件是双向执行的,从上到下request请求,从下到上response返回
- 中间件是按照 setting 中 MIDDLEWARE 的列表顺序从上到下依次执行的
- 中间件返回值是 None 则继续执行,否则直接 return 终止执行
Django框架默认中间件
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', # 内置的安全机制,保护用户与网站的通信安全 'django.contrib.sessions.middleware.SessionMiddleware', # 会话session功能 'django.middleware.common.CommonMiddleware', # 处理请求信息,规范化请求内容 'django.middleware.csrf.CsrfViewMiddleware', # 开启 CSRF(跨站请求伪造) 防护功能 'django.contrib.auth.middleware.AuthenticationMiddleware', # 内置的用户认证系统 'django.contrib.messages.middleware.MessageMiddleware', # 内置的信息提示功能 'django.middleware.clickjacking.XFrameOptionsMiddleware', # 防止恶意程序点击劫持]
Django中间件的固定方法
[函数的名称和参数都是固定的]:
process_request(self,request)#经过中间件的请求【常用】process_response(self, request, response)#经过中间件的返回响应信息,必须是HttpResponse对象【常用】process_view(self, request, view_func, view_args, view_kwargs)#经过中间件的视图处理# request 浏览器发来的请求对象# view_func 将要执行的视图函数名称# view_args 将要执行的视图函数的位置参数# view_kwargs 将要执行的视图函数的关键字参数process_exception(self, request, exception)#经过中间件的异常处理,只有在视图函数出现异常时执行process_template_response(self,request,response)#它的参数,一个HttpRequest对象,response是TemplateResponse对象(由视图函数或者中间件产生)。#process_template_response是在视图函数执行完成后立即执行,但是它有一个前提条件,那就是视图函数返回的对象有一个render()方法(或者表明该对象是一个TemplateResponse对象或等价方法)。
自定义中间件
目录架构[非运用到的文件未展示]
MyDjango APP views.py custom validation.py MyDjango settings.py urls.py
setting 中添加中间件
'custom.validation.NewMiddleware', # 类调用使用列表形式添加对应的字符串,类似importlib模块字符串导入模块方法
urls.py配置
from django.contrib import adminfrom django.urls import path,re_pathfrom APP import viewsurlpatterns = [ path('admin/', admin.site.urls), re_path("^index.html$",views.index),]
新增视图views.py
from django.shortcuts import render,HttpResponsedef index(request): print("----- 视图函数 ----") print("视图函数引用的内容:",request.Test) #raise ValueError("抛出的自定义异常,取消注释可用于异常测试") print("##################################") return HttpResponse("视图函数返回内容")
validation.py
# -*- coding:utf8 -*-from django.utils.deprecation import MiddlewareMixinfrom django.shortcuts import HttpResponseclass NewMiddleware(MiddlewareMixin): def process_request(self, request): print("自定义的 process_request 请求中间件") print("访问的URL路径:",request.path_info) request.Test = "this is test !!!" print("##################################") def process_response(self, request, response): print("自定义的 process_response 返回值中间件") print("##################################") return response def process_view(self, request, view_func, view_args, view_kwargs): print("自定义的 process_view 视图函数中间件") print("##################################") def process_exception(self, request, exception): print("自定义的 process_exception 处理异常信息中间件") print("异常信息,无异常则不执行",exception) print("##################################") return HttpResponse("ERROR !!!") def process_template_response(self, request, response): print("自定义的 process_template_response 模版返回值中间件") print("##################################") return response
执行顺序示例
自定义的 process_request 请求中间件访问的URL路径: /index.html##################################自定义的 process_view 视图函数中间件##################################----- 视图函数 ----视图函数引用的内容: this is test !!!##################################自定义的 process_response 返回值中间件##################################
注:中间件版的登录验证需要依靠session,所以数据库中要有django_session表