前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >高阶应用-中间件

高阶应用-中间件

作者头像
星哥玩云
发布2022-09-14 17:44:57
5570
发布2022-09-14 17:44:57
举报
文章被收录于专栏:开源部署开源部署

一、说明

中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。可以介入Django的请求和响应

二、本质

一个Python类

三、中间件应用场景

  • 白名单/黑名单 通过访问者用户或者IP优先通过或者拒绝一些用户的访问
  • URL访问过滤 如果用户访问的是lsogin视图(s放过) 如果访问其他视图(需要检测是不是有session已dzfr经有了放行,没有返回login),这样就省得在 多个视图函数上写装饰器了
  • 缓存 客户端请求来了,中间件去缓存看看有没有数据,有直接返回给用户,没有再去逻辑层 执行视图函数

四、方法

  • __init__ 不需要传参数,服务器响应第一个请求的时候自动调用,用于确定是否启用该中间件
  • process_request(self,request) 在执行视图之前被调用(分配url匹配视图之前),每个请求上都会调用,返回None或者HttpResponse对象 返回值是None的话,按正常流程继续走,交给下一个中间件处理,如果是HttpResponse对象,Django将不执行视图函数,而将相应对象返回给浏览器
  • process_view(self,request,view_func,view_args,view_kwargs) 调用视图之前执行,每个请求都会调用,返回None或者HttpResponse对象 参数说明
    • request是HttpRequest对象。
    • view_func是Django即将使用的视图函数(它是实际的函数对象,而不是函数的名称作为字符串)
    • view_args是将传递给视图的位置参数的列表
    • view_kwargs是将传递给视图的关键字参数的字典
    • view_args和view_kwargs都不包含第一个视图参数(request)
  • process_template_response(self,request,response) 在视图刚好执行完后调用,每个请求都会调用,返回None或者HttpResponse对象
  • process_response(self,request,response) 所有响应返回浏览器之前调用,每个请求都会调用,返回HttpResponse对象
  • process_exception(self,request,exception) 当视图抛出异常时调用,返回HttpResponse对象

五、图解

timg.jpeg
timg.jpeg

六、自定义中间件

App同级->创建工程目录middleware

|-App |-middleware |–myMiddle.py |-project

在middleware里 创建一个python文件 myMiddle.py

代码语言:javascript
复制
<span class="hljs-keyword">from</span> django.utils.deprecation <span class="hljs-keyword">import</span> MiddlewareMixin
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyMiddle</span><span class="hljs-params">(MiddlewareMixin)</span>:</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process_request</span><span class="hljs-params">(self, request)</span>:</span>
        print(<span class="hljs-string">"get参数为:"</span>, request.GET.get(<span class="hljs-string">"arg"</span>))
        print(<span class="hljs-string">"请求方法"</span>, request.method)
        <span class="hljs-comment">#HTTP_USER_AGENT</span>
        <span class="hljs-keyword">if</span> request.META[<span class="hljs-string">'REMOTE_ADDR'</span>] == <span class="hljs-string">'127.0.0.1'</span>:
            <span class="hljs-keyword">return</span> HttpResponse(<span class="hljs-string">'抱歉 您不能进行访问'</span>)
        
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process_exception</span><span class="hljs-params">(self,request,exception)</span>:</span>
        print(str(exception))
        <span class="hljs-keyword">return</span> redirect(<span class="hljs-string">'/'</span>)  <span class="hljs-comment"># 如果出现异常去首页</span>

使用自定义中间件

配置settings.py文件

MIDDLEWARE中添加

'middleware.myMiddle.MyMiddle'

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、说明
  • 二、本质
  • 三、中间件应用场景
  • 四、方法
  • 五、图解
  • 六、自定义中间件
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档