Django进阶-中间件

简介

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表

转载于:https://my.oschina.net/zhaojunhui/blog/3030179

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值