美文网首页
Django-24 中间件

Django-24 中间件

作者: JuliusL | 来源:发表于2021-07-31 12:07 被阅读0次
  • 中间件是Django请求/响应处理的钩子框架。它是一个轻量级的、低级的“插件”系统,用于全局改变Django的输入输出
  • 中间件以类的形式体现
  • 每个中间件组件负责做一些特定的功能。例如:Django包含一个中间件组件AuthenticationMiddleware,它使用会话将用户与请求关联起来。

编写中间件

  • 中间件类必须继承自django,urils.deprecation.MiddlewareMixin类

  • 中间件类需事先下列五个方法中的一个或多个:

    • process_request(self,request):
      执行路由前被调用,在每个请求上调用,返回None或HttpResponse对象
    • process_view(self,request,callback,callback_args,callback_kwargs):
      调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
    • process_response(self,request,response)
      所有响应返回浏览器前被调用,在每个请求上调用,返回HttpResponse对象
    • process_exception(self,request,exception)
      当处理过程中抛出异常时调用,返回一个HttpResponse对象
    • process_template_response(self,request,response)
      在视图函数执行完毕且试图返回的对象中包含render方法时被调用;该方法需要返回实现了render方法的响应对象
  • 注:中间件的大多数方法在返回None时表示忽略当前操作进入下一项事件,当返回HttpResponse对象时表示此请求结束,直接返回给客户端

注册中间件

  • settings.py 中需要注册一下,自定义的中间件
MIDDLEWARE = [
  ...
]
  • 注意:配置为数组,中间件被调用时以“先上到下”再“由下到上”的顺序调用

案例:访问5次禁止访问


class VisitLimit(MiddlewareMixin):

    visit_times = {}

    def process_request(self,request):
        ip_address = request.META['REMOTE_ADDR']
        path_url = request.path_info
        if not re.match('^/test',path_url):
            return 
        times = self.visit_times.get(ip_address,0)
        print('ip',ip_address,'已经访问',times)
        self.visit_times[ip_address] = times + 1
        if times < 5:
            return
        
        return HttpResponse("您已经访问过"+str(times)+"次,访问被禁止")

Django请求流程图.png

CSRF防范

  • django采用'比对暗号'机制防止攻击
  • Cookies中存储暗号1,模板中表单里藏着暗号2,用于只有在本网站下提交数据,暗号2才会随表单提交给服务器,django对比两个暗号,对比成功,则认为是合法请求,否则是违法请求-403响应码

配置步骤:

1,settings.py中确认MIDDLEWARE中django.middleware.csrf.CsrfViewMiddleware是否打开
2,模板中,form标签下添加如下标签

{% csrf_token %}

特殊说明

如果某个视图不需要django进行csrf保护,可以用装饰器关闭对此视图的检查
样例:

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def my_view(request):
  return HttpResponse('Hello world')

相关文章

  • Django-24 中间件

    中间件是Django请求/响应处理的钩子框架。它是一个轻量级的、低级的“插件”系统,用于全局改变Django的输入...

  • 翻译

    Laravel 的路由中间件 简介 创建中间件 注册中间件全局中间件为路由指定中间件中间件组 中间件参数 Term...

  • 中间件学习——具体分类

    中间件分为远程过程调用中间件、数据访问中间件、消息中间件、事务(交易)处理中间件、分布式对象中间件。 远程过程调用...

  • nodejs19-express中间件

    中间件 匹配路由之前和之后做的操作 应用级中间件 路由级中间件 错误处理中间件 内置中间件 第三方中间件 应用级中...

  • 4.3KOA 中间件模块化与中间件合成

    中间件模块化与中间件合成 一、中间件模块化 定义中间件模块 使用中间件模块 二、使用 koa-compose 模块...

  • 4.2KOA 中间件执行流程

    中间件执行流程 代码执行流程 中间件 1 开始执行中间件 2 开始执行执行内容中间件 2 结束执行中间件 1 结束...

  • 13.中间件和上下文处理器

    中间件 中间件的引入image.png django中的中间件django 中的中间件(middleware),在...

  • Express学习

    使用中间件 Express 应用可使用如下几种中间件:* 应用级中间件* 路由级中间件* 错误处理中间...

  • Express 中间件

    中间件的概念 什么是中间件 中间件(Middleware),特指业务流程的中间处理环节。 Express 中间件的...

  • Scrapy爬虫框架(七) ------ 下载中间件(Midd

    1. Spider 下载中间件(Middleware) Spider 中间件(Middleware) 下载器中间件...

网友评论

      本文标题:Django-24 中间件

      本文链接:https://www.haomeiwen.com/subject/sccvmltx.html