Backend - Django Middleware 中间件

目录

一、原理

(一)理解

1. 作用

(1)修改请求request

(2)修改响应response

2. 配置

3. 延伸 - 钩子(hooks) 框架

(二)执行顺序

1. request、view、response 之间

2. 多个 middleware 之间

二、常见中间件

(一)默认中间件

(二)常见中间件

三、自定义中间件

(一)自定义方法(理论)

1. 传统方法(五大钩子函数)

2. Django官方推荐方法

(二)自定义制作(实战)

1. 新建中间件文件

2. settings.py 里


一、原理

(一)理解

1. 作用

        是修改请求和响应对象的钩子。

        是介于请求request和响应response之间的处理过程。

(1)修改请求request

        担任“浏览器请求”和“视图处理请求”的中间角色,修改传送到 view 中的 HttpRequest 对象。

(2)修改响应response

        担任“视图返回响应”和“浏览器获取响应”的中间角色,view 返回的 HttpResponse 对象。

2. 配置

        在settings.py的 MIDDLEWARE=[ ] 中,放置中间件

3. 延伸 - 钩子(hooks) 框架

        Django钩子是指一些方法或函数,在特定事件或过程中被触发。用于自定义拦截并处理一些函数调用、事件、消息的代码

(二)执行顺序

1. request、view、response 之间

        request > middleware > view > middleware > response

2. 多个 middleware 之间

        在“request”后 &“view视图处理”前,中间件会按照settings.py设定的位置,由上往下执行;

        在“view视图处理”后 &“response”前,中间件会按照settings.py设定的位置,由下往上执行;

        举例:

                若中间件 A、B、C 中,B依赖于 A 中的参数,则设定位置时需将 B 放在 A 的后面。

二、常见中间件

(一)默认中间件

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',  # 开启网络安全保护
    'django.contrib.sessions.middleware.SessionMiddleware',  # 开启session缓存,缓存请求和响应数据,以提高性能和减少响应时间
    'django.middleware.common.CommonMiddleware',  # 通用中间件,可自动为URL路由添加www前缀和斜杠后缀
    'django.middleware.csrf.CsrfViewMiddleware',  # 开启跨域请求伪造的安全防御
    'django.contrib.auth.middleware.AuthenticationMiddleware',  # 验证用户身份(request.user)、授予或拒绝访问权限
    'django.contrib.messages.middleware.MessageMiddleware',  # 消息中间件,开启cookie或会话的消息
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

(二)常见中间件

MIDDLEWARE = [
    # . . .
    'django.middleware.locale.LocaleMiddleware',  # 开启语言language
    'admin_reorder.middleware.ModelAdminReorder',  # 开启 admin 后台管理
]

三、自定义中间件

(一)自定义方法(理论)

1. 传统方法(五大钩子函数)

def process_request(self,request) :  # 请求刚到来,执行视图之前,权限认证
def process_view(self, request, view_func, view_args, view_kwargs) :  # process_request之后,路由转发到视图,执行视图之前
def process_exception(self, request, exception) :  # 视图执行中发生异常时
def process_template_response(self,request,response) :  # 视图刚执行完毕,process_response之前, 模板渲染时执行
def process_response(self, request, response) :  # 视图执行完毕,返回响应时

2. Django官方推荐方法

有函数实现方式和类实现方式(推荐使用类实现方式)

针对类实现方式,举例:

class BookMiddleware:
    def __init__(self, get_response):
        # 一次性设置和初始化
        print('1. 只会在启动项目时执行一次')
        self.get_response = get_response  # 下一步要执行的操作
        
    def __call__(self, request):
        # 视图函数执行前的代码
        print('2. 视图函数执行前, process_view执行前的代码')
        response = self.get_response(request)
        # 视图函数执行后的代码
        print('4. 视图函数执行后的代码')
        return response
    
    def process_view(self, request, view_func, view_args, view_kwargs):
        print("3. 视图函数%s执行前的代码" % view_func.__name__)
    def process_exception(self, request, exception):
        print("5. 视图函数处理异常")

(二)自定义制作(实战)

1. 新建中间件文件

        放在项目APP文件夹内。

        例如,新建一个middleware_book.py文档,放置路径是myApp/middleware文件夹内

        文档内容,前面有举例。

2. settings.py 里

        MIDDLEWARE=[ ] 中添加自定义中间件。

# 例如:
MIDDLEWARE = [
    # . . .
    'myApp.middleware.middleware_book.BookMiddleware'  # 自定义中间件
]

你可能感兴趣的:(中间件,middleware,Django)