给cbv下面的函数加装饰器

写一个验证用户登录的程序

前端页面

# 写一个装饰器验证session
def login_auth(func):def inner(request,*args,**kwargs):if request.session.get('is_login'):return func(request,*args,**kwargs)else:return redirect('/login/')return inner

定义cbv

class Home(View):def get(self,request):passdef post(self,request):pass

视图函数

# 两种加装饰器的方法
# 1,类名上面加装饰器
from django.utils.decoration import method_decorator
@method_decorator(login_auth,name='get')  # 加在类上面的话,必须通过name指定给谁加
class Home(View):def get(self,request):passdef post(self,request):pass
# 2,方法上面加,不要用原生的装饰器,用的话,只能改参数,那样的话不通用
class Home(View):@method_decorator(login_auth) def get(self,request):passdef post(self,request):pass

第三种定义dispatch函数,拦截内置的分发函数,但是写在cbv里的 方法都会被加上装饰器

class MyHome(View):@method_decorator(login_auth)  # 第三种  get和post都会被装饰def dispatch(self, request, *args, **kwargs):super().dispatch(request,*args,**kwargs)# @method_decorator(login_auth)  # 第一种def get(self,request):return HttpResponse('get')def post(self,request):return HttpResponse('post')

Django中间件

Process_request和Process_response方法

继承MiddlewareMixin类 实现自定义中间件

from django.utils.deprecation import MiddlewareMixinclass MD1(MiddlewareMixin):def process_request(self, request):print("MD1里面的 process_request")def process_response(self, request, response):print("MD1里面的 process_response")return responseclass MD2(MiddlewareMixin):def process_request(self, request):print("MD2里面的 process_request")passdef process_response(self, request, response):print("MD2里面的 process_response")return response

在settings.py的MIDDLEWARE配置项中注册上述两个自定义中间件:

MIDDLEWARE = ['middlewares.MD1',  # 自定义中间件MD1'middlewares.MD2'  # 自定义中间件MD2
]

总结:

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

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方法,最后返回给浏览器

process_template_response和process_exception两个方法的触发是有条件的,执行顺序也是倒序。总结所有的执行流程如下:

总结

process request:请求来的时候从上往下依次执行每一个中间件里面的process request processresponse:响应走的时候会从下往上依次执行每一个中间件里面的process response方法
process view:路由匹配成功执行视图之前自动触发(从上往下依次执行)
processexception:当视图函数报错了,自动触发(从下往上依次执行)
processtemplate response:视图函数返回的对象有一个render()方法(或者表明该对象是一个TemplateResponse对象或等价方法)(从下往上依次执行)

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网站的合法用户

Django中的防止措施在前端页面写

{% csrf_token %}django就会自动帮我们渲染一个随机字符串做校验

不是网站上的所有字段都是需要校验的,这个时候我们需要给函数加上装饰器,给特定的功能加上csrf校验,或者给特定的功能不做csrf校验

在注释掉setting文件中的csrf组件前提下导入

    from django.views.decorators.csrf import csrf_exempt,csrf_protect

给指定的功能加上csrf校验用csrf_protect装饰器

这里写的加装饰器的方式与给cbf加装饰器的方式一样,需要注意的是给某些功能去掉csrf校验的装饰器csrf_exempt只有两种使用方式,都是加给全局的。

csrf_exempt  只能有下面两种方式@method_decorator(csrf_exempt,name='dispatch')  # 第一种 class Index3(View):# @method_decorator(csrf_exempt)   # 第二种  def dispatch(self, request, *args, **kwargs):super().dispatch(request,*args,**kwargs)  其实都是给dispatch加

转载于:https://www.cnblogs.com/ruhai/p/11048257.html

cbv装饰器 中间件 跨站请求伪造相关推荐

  1. django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块

    CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上 第二种 @method_decorator(login_auth,name='get') 加在类上 第三种 @met ...

  2. csrf跨站请求伪造,CBV添加装饰器,auth认证模块,基于django中间件设计项目功能

    文章目录 csrf跨站请求伪造 csrf的定义 csrf的分类 csrf的攻击过程 csrf的攻击条件 举例说明 Django提供的解决策略 csrf相关装饰器 FBV CBV 方法一(直接在类中的某 ...

  3. django16: csrf跨站请求伪造/CSRF相关装饰器

    CSRF 即跨站请求攻击 跨站请求伪造csrf钓鱼网站本质搭建一个跟正常网站一模一样的页面用户在该页面上完成转账功能转账的请求确实是朝着正常网站的服务端提交唯一不同的在于收款账户人不同给用户书写for ...

  4. Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)

    摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...

  5. 8中间件,csrf跨站请求伪造,auth模块

    昨日内容回顾  多对多三种创建方式   1.全自动    完全依赖于ManyToMany让django orm自动创建第三张表    优势:不需要你创建第三张表  自动创建    不足:第三张表扩展性 ...

  6. python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)...

    python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页) 一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 fro ...

  7. Django(part42)--跨站请求伪造

    学习笔记,仅供参考,有错必纠 文章目录 中间件Middleware 跨站请求伪造 防护方案 举个例子 中间件Middleware 跨站请求伪造 跨站请求伪造攻击 某些恶意网站上包含链接.表单按钮或者J ...

  8. Django框架之跨站请求伪造

    跨站请求伪造(英语:Cross-site request forgery),也被称为one-click attack或者session riding,通常缩写为CSRF或者XSRF, 是一种挟制用户在 ...

  9. (22)Ajax的基本使用(实现登录功能和局部刷新以及防止跨站请求伪造攻击)

    Ajax的作用 前后端分离的项目,需要交互,就要通过Ajax来完成交互 AJAX(Asynchronous Javascript And XML)翻译成中文就是"异步Javascript和X ...

最新文章

  1. Flex4 Application中与Module通信
  2. AOP和IOC的作用
  3. 硬盘显示容量和实际容量不符合_SSD小讲堂丨实力科普固态硬盘实际容量为何比标称小...
  4. 经验教训 | STM32 异常之BFARVALID,PRECISERR,INVSTATE
  5. 华为程序员面试要改:网上编程 90 分钟,现场编程 30 分钟
  6. html页面icon字体无法显示,bootstrap中icon字体图标怎么不显示?
  7. centos arm linux gcc,CentOS安装arm-linux-gcc交叉编译器
  8. 【linux】RedHat 安装 gcc、g++
  9. 遗传算法的c++语言程,C++实现简单遗传算法
  10. python 动态类型_动态类型(Dynamic type)
  11. 【转】switch中case与default的情况
  12. FISCO BCOS 零知识证明 Fiat-Shamir 实例源码
  13. Redis 五大数据类型的基本命令使用
  14. 下载并安装lsi MegaRAID raid卡 管理工具
  15. TMS320DM8168浮点DSP C674x + ARM Cortex-A8开发板VGA输出接口
  16. 淘宝万能抢单exe,含python源码
  17. pandas daraframe 写入读取excel文件,并简单计算
  18. roboone机器人_ROBOONE机器人这个品牌怎么样?是否可以加盟投资?
  19. 爬虫chromedriver被识别怎么办?
  20. jd+jbe修改jar包中class文件

热门文章

  1. 团队项目第2组-Alpha阶段规划与进度管理
  2. 华为麦芒能升级鸿蒙吗,华为鸿蒙系统或6月正式推送升级,手机版已开始小范围推送...
  3. Vue组件传值(props属性,父到子,子到父,兄弟传值)
  4. 4个概念,透过产品表面看本质
  5. CAD对象捕捉中的节点、象限点和外观交点
  6. Python界面编程第十课:Pyside2 (Qt For Python)创建StatusBar
  7. axios 封装参考和总结
  8. 详解常见面试题---深拷贝和浅拷贝(C++)
  9. Mat操作中的几种拷贝方式
  10. 解决OPPO手机通知栏无法接收消息推送