我使用ajax请求发送帖子,但由于csrf_令牌,它得到了403响应.我只使用Vuejs划分前端,使用Django划分后端,只响应API,这样我就不能使用Django模板来呈现{%csrf_token%},或者让csrftoken在会话中使用getcookie('csrftoken'),就像Django的doc推荐一样.有没有人像我一样面对这个问题,并找到了一些解决方案?所以如果你能帮我,谢谢你.

推荐答案

可以在AJAX请求的头中设置CSRF令牌.例如,如果使用jquery和jquery.cookie library,您可以轻松检索Django set csrftoken cookie,如下所示:

$.ajax({
    url : 'YOUR_URL_HERE',
    headers: {'X-CSRFToken': $.cookie('csrftoken')},
    type: 'POST',
    dataType: 'json',
    data: {},
    success: function() {

    },
    error: function(xhr, errMsg, err) {
    },  
});

Django文档还包括一个关于这一点的部分:https://docs.djangoproject.com/en/1.11/ref/csrf/#ajax

请注意,此解决方案可能取决于您的特定Django设置.上面的Django文档链接非常清楚地描述了一切.

编辑:

考虑到Django甚至无法满足您最初的页面请求,下面是您如何完成所需的内容...

1.)在Django应用程序中创建一个视图,手动生成并返回CSRF令牌(使用django.middleware.csrf.get_token):

def get_csrf_token(request):
    token = django.middleware.csrf.get_token(request)
    return JsonResponse({'token': token})

2.)您还需要在Django URL文件中添加适当的条目:

url(r'^get-token/$', get_csrf_token)

3.)然后是你的Vue.js应用程序可以使用此端点获取CSRF令牌.这不需要是用户发起的事件;例如,您可以将前端应用程序配置为在$(document).ready()事件中获取它.然后,使用您喜欢的AJAX库(在我的示例中,我使用的是jQuery):

$.ajax({
    url: '/get-token/',
    type: 'GET',
    dataType: 'json',
    success: function(data) {
       $.cookie('csrftoken', data.token); // set the csrftoken cookie
    }
});

4.)现在您的csrftoken cookie已经设置好,应该可以用于后续的POST请求.

$.ajax({
    url : 'YOUR_URL_HERE',
    headers: {'X-CSRFToken': $.cookie('csrftoken')},
    type: 'POST',
    dataType: 'json',
    data: {},
    success: function() {

    },
    error: function(xhr, errMsg, err) {
    },  
});

我已经将jQuery用于AJAX功能和jQuery.cookie库用于获取和设置cookie,但当然,您可以使用任何一个库来实现这些功能.

Vue.js相关问答推荐

具有VUE身份验证的Azure AD

我需要在 nuxt2 上使用 /index 作为 url 的一部分

在 Vue.js 2.6 的 Javascript 中访问 的内容

为什么将 name 与 router-link 一起使用比仅使用 to 与 path 更好?

在计算(computed)属性上调用数组方法

:deep() 带有嵌套 scss 规则的语法

Vue3如何将自定义事件绑定到路由视图中的特定组件?

在 VueJS 中为 Get、Post、Patch 配置全局标头的最佳方法

避免在运行时向 Vue 实例或其根 $data 添加响应式属性

有条件地在 Vue 中添加一个 CSS 类

如何将Vue的主应用程序渲染到body元素?

在 vuejs 中将旧代码修改为 vue router 4

单击链接会更改 url,但不会更改页面上的内容/数据

如何在 VUE 应用中使用 sass?

在路由更改之前显示确认对话框

如何让 Vue 在 shadow dom 中工作

在 Vue JS 组件中使用 Laravel 路由的最佳方法是什么

VueJS错误避免直接改变props

如何在 Vue 数据对象中运行函数?

用于身份验证标头的 vue-resource 拦截器