我以前有Django年的工作经验.如果在Django个模板中添加第{csrf_token}行,那么Django将处理csrf_token的功能.但当我试图用Django REST Framework开发一个API时,我陷入了困境.我如何添加和处理功能,比如csrf_token/API(后端,使用Django REST Framework开发)和React Native/React JS(前端),比如Django模板?

推荐答案

第一步是获取可以从Django csrftoken cookie中检索的CSRF令牌.

现在,从Django docs中,您可以了解如何使用以下简单的JavaScript函数从cookie中获取csrf令牌:

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 = jQuery.trim(cookies[i]);
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}

现在,您可以通过调用getCookie('csrftoken')函数来检索CSRF令牌

var csrftoken = getCookie('csrftoken');

接下来,通过将检索到的令牌分配给X-CSRFToken头,可以在使用fetch()发送请求时使用此csrf令牌.

  fetch(url, {
    credentials: 'include',
    method: 'POST',
    mode: 'same-origin',
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
      'X-CSRFToken': csrftoken
    },
    body: {}
   })
  }

Rendering the CSRF Token in React Forms:

如果使用React to render forms而不是Django templates,则还需要呈现csrf令牌,因为Django标记{ % csrf_token % }在客户端不可用,因此需要创建一个更高阶的组件,使用getCookie()函数检索令牌,并以任何形式呈现.

让我们在csrftoken.js文件中添加一些行.

import React from 'react';

var csrftoken = getCookie('csrftoken');

const CSRFToken = () => {
    return (
        <input type="hidden" name="csrfmiddlewaretoken" value={csrftoken} />
    );
};
export default CSRFToken;

然后,您可以简单地导入它并在表单中调用它

import React, { Component , PropTypes} from 'react';

import CSRFToken from './csrftoken';


class aForm extends Component {
    render() {

        return (
                 <form action="/endpoint" method="post">
                        <CSRFToken />
                        <button type="submit">Send</button>
                 </form>
        );
    }
}

export default aForm;

The Django CSRF Cookie

React动态呈现组件,这就是为什么如果使用React呈现表单,Django可能无法设置CSRF令牌cookie.Django docs是这样说的:

如果视图未呈现包含csrftoken的模板

为了解决这个问题,Django提供了需要添加到视图函数中的EnsureRecSrfcookiedecorator .例如:

from django.views.decorators.csrf import ensure_csrf_cookie

@ensure_csrf_cookie
def myview(request):

Reactjs相关问答推荐

从另一个组件更改组件中const的状态

获取点击的国家/地区名称react 映射

左边框不在图表中显示

React Router:在没有手动页面刷新的情况下,路由不会更新内容

在Reaction中导入';图片&文件夹时出错

未定义发送的数据无法在reactjs中找到原因

使用以Jest 的方式返回 Promise 的方法来模拟可构造的 API 类时出现问题

列表中的每个子项都应该有一个唯一的keyprops .在react 应用程序中

在reduce()方法上得到NaN

为什么 useEffect 的初始化对于加载 localStorage 不起作用?

DatePicker MUI 如何在日历左侧显示清除文本

使用 Jest/React 测试库时,如何测试由 setInterval 函数创建的 DOM 更改?

从其他组件切换 FieldSet

不能在我的代码中使用 .给我一个警告!有人知道解决方案吗?

SonarCloud 代码覆盖率不适用于 Github Action

如何从一组对象映射 MUI 5 图标并更改其 colored颜色 ?

如何在 Cypress E2E 的站点上测试react 组件?

如何在 Reactjs 中判断受保护路由上的用户角色?

ReactJS:按钮启用禁用更改 colored颜色

gtag:为什么谷歌分析即使没有被授权也会收集数据