30_Django中关于使用ajax发送请求中`csrf_token`的问题和解决
Posted nichengshishaonian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了30_Django中关于使用ajax发送请求中`csrf_token`的问题和解决相关的知识,希望对你有一定的参考价值。
目录
Django中关于csrf_token
的问题和解决
在需要发送POST
请求的html文件中引入下面的js代码, 我为其命名为get_csrf_token.js
, 我下面的几个处理都需要使用到这一js代码文件
$(() =>
function getCookie(name)
var cookieValue = null;
if (document.cookie && document.cookie !== '')
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++)
var cookie = cookies[i].trim();
// 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));
$.ajaxSetup(
beforeSend: function(xhr, settings)
if (!csrfSafeMethod(settings.type) && !this.crossDomain)
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
);
);
1. 在form
表单中加上% csrf_token %
2. 使用装饰器的方法,可以不用在form
表单中添加上% csrf_token %
了
(当然了这种方法与上面在每个form表单中添加上csrf_token 没有什么区别,都是只针对单个的)
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import ensure_csrf_cookie
class LoginView(View):
"""
登录
url: /user/login/
"""
@method_decorator(ensure_csrf_cookie) # 获取csrf_token值
def get(self, request):
"""
响应登录get请求
返回登录页面
"""
return render(request, 'user/login.html')
def post(self, request):
"""
登录功能
:param request:
:return:
"""
pass
3. 使用中间件,为每个请求都获取到token
(使用这个方法,所有的表单都不需要在form标签中添加上% csrf_token %
了)
- 定义一个中间件
# 文件路径,如为: utils/my_middleware.py
from django.utils.deprecation import MiddlewareMixin
from django.middleware.csrf import get_token
class GetCsrfTokenMiddleware(MiddlewareMixin):
def process_request(self, request):
"""执行视图之前被调用,在每个请求上被调用"""
get_token(request)
- 在settings.py 中找到
MIDDLEWARE
, 注册中间件
# 中间件
MIDDLEWARE = [
...
'utils.my_middleware.GetCsrfTokenMiddleware'
# '中间件文件路径.中间件文件名.定义的中间件类'
]
以上是关于30_Django中关于使用ajax发送请求中`csrf_token`的问题和解决的主要内容,如果未能解决你的问题,请参考以下文章