简介
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 admin
from django.urls import path,re_path
from APP import views
urlpatterns = [
path('admin/', admin.site.urls),
re_path("^index.html$",views.index),
]
新增视图views.py
from django.shortcuts import render,HttpResponse
def index(request):
print("----- 视图函数 ----")
print("视图函数引用的内容:",request.Test)
#raise ValueError("抛出的自定义异常,取消注释可用于异常测试")
print("##################################")
return HttpResponse("视图函数返回内容")
validation.py
# -*- coding:utf8 -*-
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
class 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表