一起学习Django框架(十)Django中间件;浅谈CSRF_TOKEN

本文介绍了Django中间件的概念、作用及自定义中间件的实现,包括process_request、process_response、process_view和process_exception方法。接着详细讨论了CSRF攻击及其防范措施,如验证HTTP Referer字段、添加token验证和自定义HTTP头验证。Django通过中间件实现CSRF保护,首次请求时生成token并存于cookie,后续POST请求通过对比token来防止CSRF攻击。文章还讲述了如何在Django中局部禁用和启用CSRF校验。
摘要由CSDN通过智能技术生成


Django中间件(MiddleWare)

中间件本身是一个很大的范围,比如:数据库中间件、服务器中间件、消息队列中间件等等…

我们这里了解到的是Django的中间件。


一、什么是中间件

Django中间件:介于request请求与response响应中间的一道处理过程,相对比较轻量级,并且在全局上改变Django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能

Django官方对中间件的定义:

Middleware is a framework of hooks into Django’s request/response processing.
中间件是Django请求/响应处理的一个钩子框架。
It’s a light, low-level “plugin” system for globally altering Django’s input or output.
它是一个轻量级的、低级的“插件”系统,用于全局改变Django的输入或输出。


二、中间件的作用

如果你想修改请求,例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现。

能你还想在view执行之前做一些操作,这种情况就可以用middleware来实现。

Django默认的中间件:在django项目的settings.py文件,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件,如下

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',
]

中间件的执行顺序:

在这里插入图片描述
每一个中间件在请求来的时候或者响应的时候都具有一定的作用。


三、自定义中间件

中间件里面主要有以下方法:

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)

3.1 process_request与process_response方法

当用户发起请求的时候会依次经过所有的的中间件,这个时候的请求首先进过process_request,最后到达views的函数中,views函数处理后,在依次穿过中间件,这个时候是process_response,最后返回给请求者。

我们要自己定义中间件的话,需要写一个类,并且继承MiddlewareMixin

from django.utils.deprecation import MiddlewareMixin

第一步:需要建立一个py文件来编写我们的中间件,建议在app应用下面创建。

MyMiddleWare.py

from django.utils.deprecation import MiddlewareMixin

class Md1(MiddlewareMixin):
    def process_request(self,request):
        print('请求到达了Md1中间件')

    def process_response(self,request,response):
        print('Md1中间件响应了请求')
        return response

class Md2(MiddlewareMixin):
    def process_request(self,request):
        print('请求到达了Md2中间件')

    def process_response(self,request,response):
        print('Md2中间件响应了请求')
        print(response.content)
        return response

第二步:在settings.py文件里面加入我们自定义的中间件

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.MyMiddleWare.Md1',
    'app01.MyMiddleWare.Md2',
]

第三步:定义视图函数

def index(request):
    return HttpResponse('Hello World!')

当我们浏览器朝服务端发送请求,必定会经过我们刚才定义的中间件
在这里插入图片描述
process_response方法的reuqest则是请求,response则是视图函数返回的内容到了中间件里面,然后由中间件return出去。所以我们是可以在process_response里面不return视图函数返回的内容,自己定义内容返回。

从下图看,正常的情况下按照绿色的路线进行执行,假设中间件1有返回值,则按照红色的路线走,直接执行该类下的 process_response 方法返回,后面的其他中间件就不会执行。

在这里插入图片描述
也就是说中间件的process_request方法使用了return,那么其后面的中间件将不再执行,直接执行该中间件和其上面中间件的process_response方法,最终将某个process_request里面的return值返回给请求者。

由此总结:

  • 中间件的process_request方法是在执行视图函数之前执行的。
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值