返回顶部
首页 > 资讯 > 后端开发 > Python >Django 中间件
  • 210
分享到

Django 中间件

中间件Django 2023-01-30 22:01:21 210人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录 一.中间件 二.中间件用途 三.中间件方法 四.自定义中间件 process_view proc

目录

  • 一.中间件
  • 二.中间件用途
  • 三.中间件方法
  • 四.自定义中间件
    • process_view
    • process_exception
    • process_template_response
  • 五.CSRF_TIKEN跨站请求伪造
  • 六.局部禁用和使用csrf

一.中间件

中间件就是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变Django的输入与输出。因为改变的是全局,所以需要谨慎使用。

DjanGo中间件的定义:

Middleware is a framework of hooks into Django’s request/response processing. 
It’s a light, low-level “plugin” system for globally altering Django’s input or output.

二.中间件用途

django的中间件,其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法,所以如果需要修改请求,例如被传送到view中的HttpRequest对象,或者是修改view返回的HttpResponse对象,就可以通过中间件来实现。

Django默认的中间件:

在django项目的settings模块中,有一个MIDDLEWARE变量

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

请求传递到Django的过程如下:

三.中间件方法

中间件的五个方法

process_request(self,request)
process_view(self, request, callback, callback_args, callback_kwargs)
process_template_response(self,request,response)
process_exception(self, request, exception)
process_response(self, request, response)

中间件方法的运行流程图:

四.自定义中间件

第一步:导入MiddlewareMixin

from django.utils.deprecation import MiddlewareMixin

第二步:自定义中间件

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse

class MyMiddelware1(MiddlewareMixin):
    def process_request(self, request):
        print('MyMiddelware1=====>request')

    def process_response(self, request, response):
        print('MyMiddelware1======>response')
        # 返回response
        return response


class MyMiddelware2(MiddlewareMixin):
    def process_request(self, request):
        print('MyMiddelware2=====>request')

    def process_response(self, request, response):
        print('MyMiddelware2======>response')
        # 返回response
        return response

第三步:在view中定义一个视图函数

def index(request):
    print('视图函数')
    return HttpResponse('aaa')

第四步:在settings.py的MIDDLEWARE里注册自己定义的中间件

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'app01.mymiddelware.MyMiddelware1',
    'app01.mymiddelware.MyMiddelware2',
]

结果:

MyMiddelware1=====>request
MyMiddelware2=====>request
视图函数
MyMiddelware2======>response
MyMiddelware1======>response

注意:如果当请求到达process_request的直接不符合条件返回,程序将把请求直接发给其对应的process_response返回.然后依次返回到请求者,结果如下:

MyMiddelware1=====>request
MyMiddelware2=====>request
MyMiddelware2======>response
MyMiddelware1======>response

总结:

1.中间件的preocess_request方法是在执行视图函数之前执行的
2.当配置多个中间件时,会按照MIDDLEWARE中的注册顺序,也就是列表的索引值,从前到后依次执行的
3.不同中间件之间传递的request都是同一个对象

process_view

process_view(self,request,callback, callback_args, callback_kwargs)

该方法由四个参数:

  • request是HttpResponse对象
  • callback是Django即将使用的视图函数
  • callback_args是将传递给视图的位置参数的列表
  • callback_kwargs是将传递给视图的位置参数的字典

Django会在调用视图函数之前调用process_view方法

它应该返回None或一个HttpResponse对象。 如果返回None,Django将继续处理这个请求,执行任何其他中间件的process_view方法,然后在执行相应的视图。 如果它返回一个HttpResponse对象,Django不会调用适当的视图函数。 它将执行中间件的process_response方法并将应用到该HttpResponse并返回结果。

process_exception

process_exception(self,request,exception)

该方法有两个参数:

  • request是HttpResponse对象
  • exception是视图函数异常产生的Exception对象

这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常。如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。它的执行顺序也是按照中间件注册顺序的倒序执行。

process_template_response

process_template_response(self,request,response)

该方法对视图函数返回值有要求,必须是一个含有render方法类的对象,才会执行此方法

五.CSRF_TIKEN跨站请求伪造

CSRF介绍:

CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性

可以这样来理解:
       攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。 如下:其中WEB A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户

CSRF攻击防范:

1.验证HTTP Referer字段
2.在请求地址中添加token并验证(Django处理方式)
3.在HTTP头中自定义属性并验证

在fORM表单中应用:

<form action="" method="post">
    {% csrf_token %}
    <p>用户名:<input type="text" name="name"></p>
    <p>密码:<input type="text" name="pwd"></p>
    <input type="submit" value="提交">
</form>

ajax中应用

<script>
    $(".btn").click(function () {
        $.ajax({
            url: '',
            type: 'post',
            data: {
                'name': $('[name="name"]').val(),
                'passWord': $("#pwd").val(),
                'csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val()
                'csrfmiddlewaretoken':'{{ csrf_token }}'
            },
            success: function (data) {
                console.log(data)
            }

        })
    })
</script>

在HTTP头中自定义属性并验证,放在cookie中:

获取cookie:document.cookie

是一个字符串,可以自己用js切割,也可以用Jquery插件

获取cookie:$cookie('csrftoken')

设置cookie:$cookie('key','value')

<script>
    $(".btn").click(function () {
        var token=$.cookie('csrftoken')
        //var token='{{ csrf_token }}'
        $.ajax({
            url: '',
            headers:{'X-CSRFToken':token},
            type: 'post',
            data: {
                'name': $('[name="name"]').val(),
                'password': $("#pwd").val(),
            },
            success: function (data) {
                console.log(data)
            }

        })
    })
</script>

六.局部禁用和使用csrf

全局禁用:注释掉中间件 'django.middleware.csrf.CsrfViewMiddleware',

局部禁用:使用装饰器,导入from django.views.decorators.csrf import csrf_exempt,csrf_protect

在FBV中使用:

from django.views.decorators.csrf import csrf_exempt,csrf_protect
# 不再检测,局部禁用(前提是全站使用)
# @csrf_exempt
# 检测,局部使用(前提是全站禁用)
# @csrf_protect
def csrf_token(request):
    if request.method=='POST':
        print(request.POST)

        return HttpResponse('ok')
    return render(request,'csrf_token.html')

在CBV中使用:

# CBV中使用
from django.views import View
from django.views.decorators.csrf import csrf_exempt,csrf_protect
from django.utils.decorators import method_decorator
# CBV的csrf装饰器,只能加载类上(指定方法为dispatch)和dispatch方法上(django的bug)
# 给get方法使用csrf_token检测
@method_decorator(csrf_exempt,name='dispatch')
class Foo(View):
    def get(self,request):
        pass
    def post(self,request):
        pass

--结束END--

本文标题: Django 中间件

本文链接: https://lsjlt.com/news/180313.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Django 中间件
    目录 一.中间件 二.中间件用途 三.中间件方法 四.自定义中间件 process_view proc...
    99+
    2023-01-30
    中间件 Django
  • Django之中间件
    中间件介绍   中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。   但是由于其影响的是全局,所以需要谨慎使...
    99+
    2023-01-30
    中间件 Django
  • django中间件-12
    目录 自定义中间件 函数定义 类定义 中间件的执行顺序 在django中,中间件其实...
    99+
    2023-01-30
    中间件 django
  • Django中间件的使用
    中间件(middleware) 中间件应用于request与服务端之间和服务端与response之间,客户端发起请求到服务端接收可以通过中间件,服务端返回响应与客户端接收响应可以通过中间件,也就是说中间件可以处理request和resp...
    99+
    2023-01-30
    中间件 Django
  • Django 中间件 请求前
    中间件: class TestMiddleware(object): """中间件类""" def __init__(self): """服务器重启之后,接收第一个请求时调用""" pas...
    99+
    2023-01-30
    中间件 Django
  • Django——中间件设置缓存
    如图所示查看网站缓存时间 在app中创建middleware.py文件,导入MiddlewareMixin,创建类并继承MiddlewareMixin 在settings中的MIDDLEWARE=[ ] 注册中间件类;添加一个CAC...
    99+
    2023-01-30
    缓存 中间件 Django
  • Django的中间件是什么
    本篇内容主要讲解“Django的中间件是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Django的中间件是什么”吧!什么是中间件(middleware) django 中的中间件(midd...
    99+
    2023-06-04
  • day 63 Django基础九之中间件
        本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏      我们在前面的课程中已经学会了...
    99+
    2023-01-31
    中间件 基础 day
  • django-10-中间件和上下文管理器
    <<<中间件的引入>>> 用户<->中间件<->url->视图  在app目录里面 middleware.py  (1)中间件就是一个可调用的对象,接受一个request并...
    99+
    2023-01-31
    上下文 管理器 中间件
  • django中间件的运行机制是什么
    Django中间件是一个轻量级、插件化的系统,用于处理请求和响应的过程。中间件是一个Python类,包含处理请求、处理响应或在视图函...
    99+
    2024-03-04
    django
  • Django中间件整合Vue拦截器的使用
    目录axios拦截器是什么?拦截器的使用请求拦截器响应拦截器Django中间件token验证中间件相关自定义中间件中间件的执行流程用中间件进行登录认证总结axios拦截器是什么? ...
    99+
    2024-04-02
  • Django 中间件实现用户认证与IP频
    1.URL访问过滤 通过装饰器进行用户认证非常方便,但是在添加部分需要认证的功能时,就需要再次添加装饰器,如果通过中间件来实现,就不需要再进行添加的操作. import re LOGIN_URL = '/login/' class MyL...
    99+
    2023-01-30
    中间件 用户 Django
  • django-基于中间件实现限制ip频繁
    ########django-基于中间件写一个限制频繁登陆######## 额额,标题已经很醒目了,通过中间件去实现,其他方法也可以实现 浏览器前端传来的请求,必须通过中间件,才能到后面路由,视图函数,所以我们在中间件那里做一层处理...
    99+
    2023-01-30
    中间件 频繁 django
  • 深入探索Django中间件的应用场景
    目录中间件的应用Django中间件概述自定义中间件总结中间件的应用 在之前的文章中,我们已经实现了用户必须登录才能投票的限制。然而,如果我们的应用中有很多功能都需要用户先登录才能执行...
    99+
    2023-05-18
    Django中间件 Django中间件的作用
  • django中间件怎么给下一个函数赋值
    在Django中间件中,可以通过request对象的属性来给下一个函数赋值。下面是一个简单的示例代码: class CustomMi...
    99+
    2024-03-04
    django
  • Django 中间件:理解请求和响应生命周期
    Django 中间件是一种功能强大的工具,可用于在请求和响应的生命周期中自定义行为。通过编写自己的中间件,可以添加额外的功能,如身份验证、授权、请求验证和响应修改。本文将深入探讨 Django 中间件,了解其工作原理以及如何利用它来增强 ...
    99+
    2024-02-15
    Django 中间件 请求 响应 生命周期
  • Django基础CBV装饰器和中间件的应用示例
    目录1. CBV加装饰器2. Django中间件2.1 Django中间件介绍2.2 自定义中间件2.3 自定义中间件总结2.4 其他中间件函数2.5新版本中间件写法3.Csrf中间...
    99+
    2024-04-02
  • Django中ContentType组件怎么用
    这篇文章将为大家详细讲解有关Django中ContentType组件怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题如何在一张表上对多个表进行外键关联from django.db&nbs...
    99+
    2023-06-21
  • 如何在Go和Django之间构建接口文件?
    在当今的软件开发中,构建API(应用程序接口)是非常重要的一项工作。这些接口允许不同的应用程序之间进行通信,并共享数据和功能。在构建接口时,选择合适的技术和框架是至关重要的。Go和Django是两个非常流行的框架,本文将介绍如何在这两个框架...
    99+
    2023-08-25
    django 接口 文件
  • ASP.NETCore中间件
    目录1.前言2.使用中间件2.1 Run2.2 Use2.3 Map和MapWhen3.顺序4.编写中间件(重点)4.1中间件类4.2中间件扩展方法5.按每次请求创建依赖注入(DI)...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作