问csrftoken在Django里面是基于什么实现的?------>中间件。

如果是Django表示每次发请求过来的时候,要检验有没有带随机字符串。当在执行视图函数之前,前面还有一道屏障,这个屏障就是用来判断带没带这个随机字符串,带了就可以继续往下走,没带就直接让它返回。根本到不了要请求的那里。

csrftoken在view方法里面。为什么呢?(中间件里做判断,如果加了免除csrf免除认证装饰器,它得做个判断得找到那个函数找到它上面的那个装饰器。而对于process_view而言,根本没到达路由匹配根本没找到函数,只有到process_view之后才能找到函数才能做判断。)

  发过来请求,拿到token,验证这个token是不是我之前发的,如果带了就让继续执行,没带就直接返回。

  加这个装饰器,意味着这个函数免除csrtoken认证。

from django.views.decorators.csrf import csrf_exempt

# Create your views here.

@csrf_exempt
def users(request): user_list = ['zgr', 'oldboy']
return HttpResponse(json.dumps(user_list))

来做csrftoken认证的时候做两件事(process_view做的):

第一件事先判断加没加这个装饰器

第二件事获取请求过来的token(请求体或cookie中)并进行验证是否遵循csrftoken规则,如果验证通过则继续执行,如果验证不通过则返回。

Django最多可以写几个方法?

  process_request

  process_response

  process_view

  process_exception   (异常之后执行)

  process_render_template  (这个返回的对象视图函数永远不执行,因为没有render方法。)

中间件的执行流程是什么样子的?

  看Django版本。

  Django1.10 以上版本。

    请求进来先执行Django中间件所有的request,执行路由匹配,意味着找到函数,但不执行。

    跳回来在执行view,都执行完,执行视图函数。

    视图函数在执行response再返回。

    如果报错exception执行。

    如果返回的对象有render方法,render_tempate方法也会被执行。

中间件做过什么?

  权限

  用户登录认证(之前是在每个视图函数之前加装饰器)为了省事不需要再每个函数加装饰器了,只要在中间件做一次判断就可以了。

  csrftoken

如果不注释    'django.middleware.csrf.CsrfViewMiddleware',  意味着全局全栈整个网站只要发指定请求都是遵循csrftoken的要求。

不想要csrftoken认证的时候可以给他加个装饰器。

from django.views.decorators.csrf import csrf_exempt
# Create your views here. @csrf_exempt
def users(request): user_list = ['zgr', 'oldboy']
return HttpResponse(json.dumps(user_list))

还可以中间件注视了都不用,但是就想让他用怎么办?也是加个装饰器

rom django.views.decorators.csrf import csrf_protect

# Create your views here.

@csrf_protect
def users(request): user_list = ['zgr', 'oldboy']
return HttpResponse(json.dumps(user_list))

对csrft现在有两种设置方式了,一种是中间件,一种是装饰器。

如果cbv里面不想用csrftoken怎么办?

  如果在cbv加装饰器导入

from django.utils.decorators import method_decorator
把@method_decorator(csrf_exempt)这个装饰器,并把csrf_exempt当做参数传进来。
到dispatch中就可以了。免除csrftoken认证。
class StudentsView(MyBaseView,View):

    @method_decorator(csrf_exempt)
def dispatch(self, request,*args, **kwargs):
print('before')
ret = super(StudentsView, self).dispatch(request, *args, **kwargs)
print('after')
return ret def get(self, request, *args, **kwargs):
print('get方法')
return HttpResponse('GET') def post(self, request, *args, **kwargs):
return HttpResponse('POST') def delete(self, request, *args, **kwargs):
return HttpResponse('DELETE')

还有一种dispatch方法不用写,加到类里面去。这样也可以。

@method_decorator(csrf_exempt,name='dispatch')  #name是里面的方法名。  找到这个对象StudentsView的dispatch这个方法并给这个方法加上装饰器。
class StudentsView(View): 

  def get(self, request, *args, **kwargs): 
    print('get方法')
    return HttpResponse('GET')
  def post(self, request, *args, **kwargs):
    return HttpResponse('POST')

csrf补充的更多相关文章

  1. 3.CBV视图之csrf补充

    CBV使用csrf装饰器关闭/开启 csrf验证,直接在函数上加装饰器无效的 #方法1 from django.views import View from django.views.decorato ...

  2. Django 五——中间件、缓存、CSRF、信号、Bootstrap(模板)

    内容概要: 1.Django的请求生命周期是怎么样的? 2.中间件 3.CSRF补充 4.信号 5.Bootstrap(模板) 1.Django的请求生命周期是怎么样的? (即请求发起到返回都经历了什 ...

  3. 22期老男孩Ptython全栈架构师视频教程

    老男孩Ptython全栈架构师视频教程 Python最新整理完整版22期视频教程 超60G课程容量<ignore_js_op> <ignore_js_op> <ignor ...

  4. django上课笔记3-ORM补充-CSRF (跨站请求伪造)

    一.ORM补充 ORM操作三大难点: 正向操作反向操作连表 其它基本操作(包含F Q extra) 性能相关的操作 class UserInfo(models.Model): uid = models ...

  5. 浅谈CSRF攻击方式

    一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR ...

  6. 关于XSS(跨站脚本攻击)和CSRF(跨站请求伪造)

    我们常说的网络安全其实应该包括以下三方面的安全: 1.机密性,比如用户的隐私被窃取,帐号被盗,常见的方式是木马. 2.完整性,比如数据的完整,举个例子,康熙传位十四子,被当时四阿哥篡改遗诏:传位于四子 ...

  7. CSRF token 无法被验证. ----Yii连接数据库后数据库错误日志报错

    CSRF token 无法被验证. 我使用的是mongodb+ yii1.1 What is CSRF, please see the details here.  http://en.wikiped ...

  8. Django实现表单验证、CSRF、cookie和session、缓存、数据库多表操作(双下划綫)

    通常验证用户输入是否合法的话,是前端js和后端共同验证的,这是因为前端js是可以被禁用的,假如被禁用了,那就没法用js实现验证合法与否了,也就是即使用户输入的不合法,但是也没提示,用户也不知道怎么输入 ...

  9. python第二十天-----Django补充

    学习python已经20天了啊,从一个不萌萌哒的战5渣升级到了一个萌萌哒的战5渣 1.分页(这是一个很通用的模块,不论在任何框架里都可以使用哦) class Page(object): def __i ...

随机推荐

  1. Android studio中布局文件出现render problem问题

    当做layout时,可能会出现render problem的情况.意思就是无法预览当前布局页面,这种情况是因为API版本太高造成的.只需要修改API为更低版本即可.

  2. RocketMQ事务消息-demo

    RocketMQ为4.3.0版本(我这种写法4.2.0不行) 如果你之前用的其他版本,需要去修改下系统的环境变量 maven工程用到的jar包 <dependencies> <!-- ...

  3. Spring Security(二):一、Preface(前言)

    Spring Security is a powerful and highly customizable authentication and access-control framework. I ...

  4. JS中caller和callee

    caller: caller是函数对象的一个属性,指的是这个函数对象的调用者,如果调用者,如果是顶层调用者,则返回null. 例: function func(){ console.log(func. ...

  5. WebBench压力测试工具(详细源码注释+分析)

    本文适合人群:对WebBench实现感兴趣的人 WebBench原理: Linux下使用的服务器压力测试工具,利用fork建立多个子进程,每个子进程在测试时间内不断发送请求报文,建立多个连接,然后由父 ...

  6. [SHOI2006]color 有色图[群论、组合计数]

    题意 用 \(m\) 种颜色,给 \(n\) 个点的无向完全图的 \(\frac{n(n-1)}{2}\) 条边染色,两种方案相同当且仅当一种方案交换一些点的编号后可以变成另一种方案.问有多少本质不同 ...

  7. 【原创】研发应该懂的binlog知识(上)

    引言 为什么写这篇文章? 大家当年在学MySQL的时候,为了能够迅速就业,一般是学习一下MySQL的基本语法,差不多就出山找工作了.水平稍微好一点的童鞋呢还会懂一点存储过程的编写,又或者是懂一点索引的 ...

  8. Vue.js 系列教程 1:渲染,指令,事件

    原文:intro-to-vue-1-rendering-directives-events 译者:nzbin 如果要我用一句话描述使用 Vue 的经历,我可能会说“它如此合乎常理”或者“它提供给我需要 ...

  9. Java性能优化之编程技巧总结

    程序的性能受代码质量的直接影响.在本文中,主要介绍一些代码编写的小技巧和惯例,这些技巧有助于在代码级别上提升系统性能. 1.慎用异常 在Java软件开发中,经常使用 try-catch 进行错误捕获, ...

  10. Spring Boot 2 (十):Spring Boot 中的响应式编程和 WebFlux 入门

    Spring 5.0 中发布了重量级组件 Webflux,拉起了响应式编程的规模使用序幕. WebFlux 使用的场景是异步非阻塞的,使用 Webflux 作为系统解决方案,在大多数场景下可以提高系统 ...