django如何设置csrf_token
作者:scott_zhb
这篇文章主要介绍了django如何设置csrf_token问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
一、关于csrf_token
- csrf:跨站请求伪造,防止其他人改造,盗取信息,反正就是一种网站的防护措施
- 服务器端:设置随机的csrf_token,get请求的时候就该设置好
- 客户端:携带上相应的csrf_token,post请求的时候携带上
二、form表单设置csrf_token
通过模板标签进行设置
当提交post请求的时候会自动带上
三、针对某个类视图设置csrf_token
from django.views.decorators.csrf import ensure_csrf_cookie from django.utils.decorators import method_decorator from django.views import View class LoginView(View): @method_decorator(ensure_csrf_cookie) def get(self, request): pass def post(self, request): pass
针对整个项目中所有视图设置csrf_token
①自定义中间件,在utils目录下创建CsrfMiddleware.py,如下图所示:
②注册中间件,在项目目录下的settings.py中,如图所示写上全路径
四、提交post请求携带csrf_token
前面说到,form表单是自动携带上的,那么ajax请求是如何携带csrf_token的呢?
很简单,通过jquery获取,在ajax请求之后附加如下js代码:
// get cookie using jQuery function getCookie(name) { let cookieValue = null; if (document.cookie && document.cookie !== '') { let cookies = document.cookie.split(';'); for (let i = 0; i < cookies.length; i++) { let cookie = jQuery.trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) === (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } // Setting the token on the AJAX request $.ajaxSetup({ beforeSend: function (xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); } } });
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。