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

相关推荐
weixin_382395231 天前
0-500 人工厂的生产 PMC 系统怎么做?基于 Tauri + SQLite 的性能架构实践与 5000 物料压测实录
数据库·架构·sqlite
winfredzhang2 天前
从零实现“照片按地理位置显示在矢量地图上”:Flask + SQLite + Leaflet 全栈实战
python·sqlite·flask
愤怒火龙果2 天前
AI攻防 LLM中间件
人工智能·网络安全·中间件
weixin_BYSJ19872 天前
【计算机毕设】基于Spring_Boot_Vue的马拉松报名与选手成绩追踪系统05445
java·vue.js·spring boot·学习·spring·django·课程设计
小马不起床3 天前
Django 后端实战指南_10:用户扩展档案信息表
python·django·sqlite
小马不起床3 天前
Django 后端实战指南_9:前后端完整联调和问题修复
python·django·状态模式
ydjs678899-bot3 天前
您的Next.js中间件匹配器配置可能会跳过您认为它保护的路由
开发语言·javascript·中间件
ycydynq3 天前
django用Bootstrap 模态框 在同一页面实现增删改查
django·bootstrap·jquery
软件交付观察室3 天前
数据大屏总数与明细为什么对不上?2026项目开发排查指南
软件测试·数据库·sql·sqlite·数据可视化
零基础1233 天前
为什么 Agent 用 SQLite 数据库?
前端·人工智能·sqlite·开源