• 25.中间件


    目录

    1  概念

    2  配置

    3  自定义中间件

    3.1  创建

    3.2  注册

    3.3  使用情况

    4  中间件的执行顺序

    5  中间件csrf防范的使用方式

    6  应用

    6.1  限制请求次数


    1  概念

    中间件是处理请求与响应的插件,很像flask中的异常处理与请求钩子 11.异常处理与请求钩子_Suyuoa的博客-CSDN博客

    django中中间件以类的形式展现,类必须继承 django.utils.deprecation.MiddlewareMixin

    中间件必须实现下列五个方法中的一个或多个

    • process_template_response的render方法指的并不是模板的那个render方法,而是视图函数的响应中有render的属性,我们在下面使用的时候会提到

    中间件中大多数放我可以通过返回None表示忽略当前操作进入下一项事件,当返回响应对象时表示此请求结束,直接返回给客户端

    • 大概意思就是如果没出什么问题你返None就行了,如果出了问题你也别让用户直接看到问题,给用户一个写好的响应结果

    2  配置

    在setting.py中的MIDDLEWARE处已经有一些默认的中间件

    默认的中间件意思分别是

    • django.middleware.security.SecurityMiddleware 请求与响应的安全改进
    • django.contrib.sessions.middleware.SessionMiddleware 如果没有这个就不能使用session
    • django.middleware.common.CommonMiddleware 通用中间件,功能可以看一下这个 内置中间件CommonMiddleware_长大的小蚂蚁的博客-CSDN博客
    • django.middleware.csrf.CsrfViewMiddleware csrf(跨站请求伪造)保护,跨站请求伪造大致意思是你登录了A网站后没有推出,然后你登录了B网站(同一个浏览器打开两个标签页),然后B网站获取到了A网站的信息,并伪装成你给A网站发请求。想了解csrf可以看一下这个 CSRF简介_manster1231的博客-CSDN博客_csrf
    • django.contrib.auth.middleware.AuthenticationMiddleware 有了这个可以使用request.user来表示当前登录的用户
    • django.contrib.messages.middleware.MessageMiddleware 消息框架中间件,使用这个中间件上面的session中间件必须开启,且session中间件要在message中间件的上方
    • django.middleware.clickjacking.XFrameOptionsMiddleware 点击劫持保护

    3  自定义中间件

    3.1  创建

    一般我们会在项目目录下创建一个名为middleware的Python Package来放置自定义中间件

    先创建一个文件夹名为middleware再创建一个__init__.py也是一样的

    之后我们在middleware中再新建一个py文件,我命名为test,在test中我们先简单写一下

    • process_response与process_template_response方法一定要返回一个response对象,不然请求就没有响应了,会报错
    • 如果process_template_response没触发那你不给也不会报错

    3.2  注册

    之后我们到settings.py中注册该中间件

    依次是 文件夹名 文件名 类名

    之后再搞一个路由

    搞一个视图

    3.3  使用情况

    我们先访问test_middleware

    • 使用了render属性就会以你定义方法中的返回值返回,之前的返回值就没用了

    看一下终端的情况,第一个是我们test_middleware的请求,第二个是favicon(网页上的图标)我们可以忽略

    先看一下执行顺序,首先是中间件的process_request,然后是中间件的process_view,之后执行视图函数,之后是中间件的process_template_response,之后执行render的方法,最后执行中间件的process_response

    正常来说是不会走发生异常的(访问为定义的路由也不会触发process_exception),我们如果要出发异常可以配合python的关键字raise

    4  中间件的执行顺序

    我们现在再搞一个中间件测试一下,在print()的内容最后都加一个1,方便区分

    之后进行注册

    之后再访问有raise的那个路由

    发现中间件的执行顺序在进视图之前按注册顺序正着来,进视图之后按注册顺序反着来

    5  中间件csrf防范的使用方式

    django的csrf防范方式为在页面中存一个值,然后在cookie中存一个值,在请求的时候如果这两个值匹配则判定为正常请求,如果不匹配则判定为非法请求。

    首先我们打开csrf中间件

    之后我们再搞一个路由和视图

    只有POST提交表单的时候会使用到csrf,使用GET请求没有影响

    但使用POST就有影响了,我们直接点击提交会返回403

    我们需要在模板层的form中加入{% csrf_token %} 来完成csrf验证

    这样再点击提交就没问题了

    在cookie中可以看到csrftoken

    在网页源代码中可以看到一个名为csrfmiddlewaretoken的input,这个input是隐藏的,这里的input的值与cookie值是配套的

    现在我想让该视图不进行csrf校验,我们可以使用csrf_exempt装饰器

    这样取消掉模板中的 {% csrf_token %}

    也是可以成功提交的

    6  应用

    6.1  限制请求次数

    我们现在限制每个用户每十秒只能访问/test开头的地址5次,使用request.META['REMOTE_ADDR']可以得到远程客户端的IP地址,使用request.path_info可以得到客户端访问的请求路由信息

    之后去settings.py中进行注册

    我们访问一下路由test_csrf,前5次都可以正常访问

    第六次会出现提示

    等待十秒后再次访问

    发现可以正常访问 

  • 相关阅读:
    ubuntu系统 kubeadm方式搭建k8s集群
    软考系列(系统架构师)- 2012年系统架构师软考案例分析考点
    HTTPS的加密流程
    十二、模板方法模式
    剖析C语言中的自定义类型(结构体、枚举常量、联合)兼内存对齐与位段
    这些Java基础知识,诸佬们都还记得嘛(学习,复习,面试都可)
    计算机毕业设计ssm社会救援力量信息管理统计系统6q3cn系统+程序+源码+lw+远程部署
    基于php+MYSQL的旅游景点攻略的设计与实现毕业设计源码301216
    6.使用leetcode去练习语言
    香草酸豌豆白蛋白1b纳米粒Vanillic Acid-PA1b|汉黄芩苷牛血清白蛋白纳米粒Wogonoside-BSA|科研试剂
  • 原文地址:https://blog.csdn.net/potato123232/article/details/126900449