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中),响应后的顺序是从下往上(注册的反顺序)

相关推荐
Risehuxyc2 天前
Microsoft.Data.Sqlite体验
数据库·sqlite
大维2 天前
DBX 实测:从 SQLite 查询到 MiniMax-M3 自然语言生成 SQL
数据库·sql·sqlite
deepseek232 天前
Agent任务中途断线,怎么避免重复执行?SQLite检查点实测
python·sqlite·任务调度·幂等性·ai agent
高调的涵涵3 天前
五个进程同时写 SQLite,谁在丢数据
sqlite
FungLeo3 天前
成为全栈·基础补充·数据库索引:为什么加了索引还是慢
mysql·postgresql·sqlite·sql优化·数据库索引·成为全栈
真上帝的左手5 天前
30. 技术专题-‌应用框架组件-关系型数据库-MySQL-Mybatis
数据库·分布式·mysql·中间件·mybatis
9624565 天前
容器 RUNNING,为什么中间件仍不可用?ActiveMQ 与 Kafka/ZooKeeper 恢复实录
中间件·kafka·activemq
真上帝的左手5 天前
30. 技术专题-‌应用框架组件-缓存-Redis
数据库·redis·分布式·缓存·中间件
真上帝的左手5 天前
30. 技术专题-‌应用框架组件-搜索引擎-ES
大数据·分布式·elasticsearch·搜索引擎·中间件
实名上网宋凯宣5 天前
Django
后端·python·django