[django]中间件&上下文管理器

本文深入探讨了Django中间件的原理与应用,包括如何通过中间件处理请求和响应,实现反爬虫策略,以及使用类定义中间件的方法。同时介绍了如何在Django中注册和使用上下文管理器,为所有页面提供统一的上下文数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

中间件

django中的数据流就是请求和响应, 如果将django比作一个工厂, 数据请求代表进货, 将数据进行加工然后再出货也就是响应, 中间的加工过程就可以用中间件来完成

含义: 处理接收的请求和发出的响应的组件, 都是由中间件来完成

本质: 是一个具有指定方法的类

函数定义中间件

文件名命名不受限, 放置的路径也不受拘束, 可以放在django项目下的任意位置, 必须是可导入的路径

文件中定义方法, 方法名随意 , 传入参数get_response, 参数名不能改

  1. 首先我们先来写一个简单的中间件

    def simple_middleware(get_response):
        print('进入中间件')
    
        def middleware(request):
            print('处理请求前')
            response = get_response(request)
            print('处理请求后')
            return response
        return middleware
    
  2. 使用之前, 要去激活中间件

    MIDDLEWARE = [
        ...
        # 中间件函数的完整python路径
        'teacher.middleware.simple_middleware',
    ]
    
实现简单的反爬

有了上面的基础我们可以实现一个简单的反爬措施, 将上面的代码改写:

from django.http import HttpResponseForbidden

def simple_middleware(get_response):
    print("进入中间件")

    def middleware(request):
    	# 获取UA
        user_agent = request.META['HTTP_USER_AGENT']
        # 判断UA中是否包含chrome浏览器
        if not 'chrome' in user_agent.lower():
            return HttpResponseForbidden()
        ...

类定义中间件

使用类定义效果和函数定义相同, 但是类可以使用更好的方式

class SimpleMiddleWare():
    def __init__(self, get_response):
        self.get_response = get_response
        print('==进入中间件==')

    def __call__(self, request):
        print('==处理请求前==')
        response = self.get_response(request)
        print('==处理请求后==')
        return response

同样也需要注册

MIDDLEWARE = [
    ...
    'firstapp.middleware.SimpleMiddleWare'
]

多个中间件

如果过设置了多个中间件, 执行时就会按settings中的导入顺序执行, 第一个中间件执行到response = get_response(request)时, 就会去调用下一个中间件 , 依次类推 , 从里往外执行

例如上面两种写法如果在一起运行的话, 运行结果就会是:

==进入中间件==
进入中间件
处理请求前
==处理请求前==
==处理请求后==
处理请求后

上下文管理器

django提取context中的数据去供模板调用

需求: 所有的页面都需要一个特定的变量

本质: python函数 , 接收一个HttpRequest对象的参数 , 且返回的必须是一个字典

定义上下文管理器

文件名命名不受限, 放置的路径也不受拘束, 可以放在django项目下的任意位置

  1. 定义

    def my_name(request):
        return {'name': 'Jack'}
    
  2. 写好之后去settings.py中去注册

    TEMPLATES = [
    	...
         'context_processors': [
                ...
                'firstapp.customer_context.my_name'
                ...
    
  3. 注册好后可以在所有的配置文件使用, 将{{ name }}加到模型中就可以显示

    ...
    <body>
    {{ name }}
    <form action="" method="post">
        ...
    

如果同时有上下文管理器, 和上下文数据(context), 他们是按照顺序执行的, 如果这两者都有相同的变量名时 , context生效

可以用在想要使用重复变量的时候

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值