• [django]中间件


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

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

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

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

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

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

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

    def middleware(request):
    print('处理请求前')
    response = get_response(request)
    print('处理请求后')
    return response
    return middleware
    1
    2
    3
    4
    5
    6
    7
    8
    9
    使用之前, 要去激活中间件

    MIDDLEWARE = [
    ...
    # 中间件函数的完整python路径
    'teacher.middleware.simple_middleware',
    ]
    1
    2
    3
    4
    5
    实现简单的反爬
    有了上面的基础我们可以实现一个简单的反爬措施, 将上面的代码改写:

    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()
    ...
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    类定义中间件
    使用类定义效果和函数定义相同, 但是类可以使用更好的方式

    class SimpleMiddleWare(http://www.my516.com):
    def __init__(self, get_response):
    self.get_response = get_response
    print('==进入中间件==')

    def __call__(self, request):
    print('==处理请求前==')
    response = self.get_response(request)
    print('==处理请求后==')
    return response
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    同样也需要注册

    MIDDLEWARE = [
    ...
    'firstapp.middleware.SimpleMiddleWare'
    ]
    1
    2
    3
    4
    多个中间件
    如果过设置了多个中间件, 执行时就会按settings中的导入顺序执行, 第一个中间件执行到response = get_response(request)时, 就会去调用下一个中间件 , 依次类推 , 从里往外执行

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

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

  • 相关阅读:
    QQ 2006 正式版协议变动情况分析
    开源3D方面的软件
    要使silverlight能够在IIS中顺利运行,需要设置的东西.
    文本框回车自动提交
    No installed Service named "Apache2"
    Javascript:三个函数ceil()、floor()、round()的区别
    基于Apache的Svn服务器配置
    下载:HD AUDIO For XP SP3修正补丁
    ViewState在执行Refresh后丢失
    C#关闭应用程序时如何关闭子线程
  • 原文地址:https://www.cnblogs.com/ly570/p/11322875.html
Copyright © 2020-2023  润新知