Django中间件:请求拦截和响应(类似装饰器)

文章目录

Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理对程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。
中间件的定义:定义一个中间件工厂函数,然后返回一个可以被调用的中间件。中间件工厂函数需要接收一个可以调用的get_response对象。返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象。
我们可以使用中间件,在Diango处理视图的不同阶段对输入或输出进行干预。setting.py 中的 MIDDLEWARE 是中间件信息
建立中间件文件 middleware/middleware.py (类似装饰器)

python 复制代码
def simple_middleware(get_response):
    def middleware(request):
        print('before request')
        # 响应前
        response = get_response(request)
        # 响应后
        print('after request')
        return response
    return middleware

在setting.py 中的 MIDDLEWARE 中加入如下内容

python 复制代码
# 中间件
MIDDLEWARE = [
    # ...
    'ProjectName.middleware.simple_middleware',   # 添加这行
]

让后访问触发view函数,终端就会打印before request和after request
实例:可以用中间件来判断每次请求是否携带了cookie中的某些信息,通常如果不使用中间件,需要在每个函数中都添加判断的代码
不使用中间件写法如下(每个函数都要加cookie判断)

python 复制代码
from django.views import View
from django.contrib.auth.mixins import LoginRequiredMixin

class CenterView(LoginRequiredMixin, View):
    def get(self, request):
        username = request.COOKIES.get('username')
        if username is None:    # 添加判断
            print('username is None')
            return HttpResponse('没有登入')
        return HttpResponse('个人中心展示')

    def post(self, request):
        username = request.COOKIES.get('username')
        if username is None:    # 添加判断
            print('username is None')
            return HttpResponse('没有登入')
        return HttpResponse('个人中心信息修改')

中间件写法:可以利用中间件,在中间件中加入cookies检测,views视图中就可以不用使用检测

python 复制代码
def simple_middleware(get_response):
    def middleware(request):
        # 添加判断
        username = request.COOKIES.get('username')
        if username is None:
            print('username is None')
            return HttpResponse('没有登入')
        response = get_response(request)
        return response
    return middleware
python 复制代码
from django.views import View
from django.contrib.auth.mixins import LoginRequiredMixin

class CenterView(LoginRequiredMixin, View):
    def get(self, request):
        return HttpResponse('个人中心展示')

    def post(self, request):
        return HttpResponse('个人中心信息修改')

多个中间件顺序:请求前的执行顺序是按照注册的顺序从上往下(settings.py中),响应后的顺序是从下往上(注册的反顺序)

相关推荐
jingli917 小时前
一个测试用例把连接池卡死 30 秒:SQLite 连接池 max_size=1 下的重入自锁复盘
jvm·sqlite·测试用例
言乐618 小时前
Python排名统计折线图
开发语言·python·django·virtualenv·pygame
程序猿乐锅19 小时前
【黑马点评 | 第九篇】秒杀优化-异步实现
java·spring boot·redis·后端·spring·中间件·mybatis
Wx-bishekaifayuan19 小时前
springboot户外登山社交小程序19787-计算机课程设计、毕业设计
spring boot·后端·python·spring·elasticsearch·django·课程设计
FYKJ_201019 小时前
springboot刑事案件管理系统03047-计算机课程设计、毕业设计
vue.js·spring boot·python·mysql·typescript·spark·django
FYKJ_201020 小时前
springboot助农产品销售商城05829-计算机课程设计、毕业设计
java·spring boot·python·mysql·spark·django
Wx-bishekaifayuan21 小时前
springboot社区扶贫救助管理系统13300-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
Wx-bishekaifayuan1 天前
springboot甘肃特产服务平台50301-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
FYKJ_20101 天前
springboot雅集社区养老管理系统04456-计算机课程设计、毕业设计
vue.js·spring boot·python·mysql·typescript·spark·django
FYKJ_20101 天前
springboot羽毛球场地管理系统00626-计算机课程设计、毕业设计
vue.js·spring boot·python·mysql·typescript·spark·django