中间件组件
Posted xujinjin18
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中间件组件相关的知识,希望对你有一定的参考价值。
一:什么是中间件
二:中间件有什么用
三:自定义中间件
四:中间件应用场景
五:CSRF-TOKEN跨站请求伪造
六:组件禁用
一:什么是中间件
介于request与response处理之间的一道处理过程
二:中间件有什么用
如果你想修改请求,例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现。
可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现。
Django默认的中间件:(在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件,如下图)
每一个中间件都有具体的功能
每个都是一个类 继承 MiddlewareMixin 有五个方法
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)
三:自定义中间件
1 在settings middleware中配置 使用
2 写文件
当用户发起请求的时候会依次经过所有的的中间件,这个时候的请求时process_request,最后到达views的函数中,views函数处理后,在依次穿过中间件,这个时候是process_response,最后返回给请求者。
##############################
process_request process_response 流程图
注意如果在中间件的request return了则直接返回流程图如下
##############################
Process_view 流程图
process_view(self, request, view_func, view_args, view_kwargs)
request是HttpRequest对象。
view_func是Django即将使用的视图函数。 (它是实际的函数对象,而不是函数的名称作为字符串。)
view_args是将传递给视图的位置参数的列表.
view_kwargs是将传递给视图的关键字参数的字典。 view_args和view_kwargs都不包含第一个视图参数(request)。
Django会在调用视图函数之前调用process_view方法。
它应该返回None或一个HttpResponse对象。 如果返回None,Django将继续处理这个请求,执行任何其他中间件的process_view方法,然后在执行相应的视图。 如果它返回一个HttpResponse对象,Django不会调用适当的视图函数。 它将执行中间件的process_response方法并将应用到该HttpResponse并返回结果。
process_view可以用来调用视图函数:
注意:process_view如果有返回值,会越过其他的process_view以及视图函数,但是所有的process_response都还会执行。
##############################
process_exception(self, request, exception)
该方法两个参数:
一个HttpRequest对象
一个exception是视图函数异常产生的Exception对象。
这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常。如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。它的执行顺序也是按照中间件注册顺序的倒序执行。
##############################
Proccess_template_response
该方法对视图函数返回值有要求,必须是一个含有render方法类的对象,才会执行此方法
中间件 必须写这个 然后才能调用类
Views 必须是render方法
应用:
##############################
四:中间件应用场景
1、做IP访问频率限制
某些IP访问服务器的频率过高,进行拦截,比如限制每分钟不能超过20次。
2、URL访问过滤
如果用户访问的是login视图(放过)
如果访问其他视图,需要检测是不是有session认证,已经有了放行,没有返回login,这样就省得在多个视图函数上写装饰器了!
##############################
五:CSRF-TOKEN跨站请求伪造
一:什么是CSRF
CSRF(Cross-site request forgery)跨站请求伪造
CSRF则通过伪装来自受信任用户的请求来利用受信任的网站
二:攻击原理
三:解决方案
(1)验证 HTTP Referer 字段
一定程度上有用
(2)在请求地址中添加 token 并验证
这种方法要比检查 Referer 要安全一些
(3)在 HTTP 头中自定义属性并验证
这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。
Django有自己的封装好的中间件:
应用举例:
在html中加上:
每次请求返回的字符串都不一样,提交时带着这个字符串
1 在form表单中应用
2 在Ajax中应用:
六:组件禁用
全站禁用:注释掉中间件 ‘django.middleware.csrf.CsrfViewMiddleware‘,
局部禁用:
FBV
CBV 装饰器必须装饰类上面或者dispatch上面
以上是关于中间件组件的主要内容,如果未能解决你的问题,请参考以下文章