gpt4 book ai didi

python - 如何在 Django RESTful API 和 React 中使用 csrf_token?

转载 作者:行者123 更新时间:2023-12-03 13:28:40 24 4
gpt4 key购买 nike

我以前有过使用 Django 的经验。如果在 Django 模板中添加行 {csrf_token} ,则 Django 会处理 csrf_token 的功能。但是当我尝试使用 Django REST Framework 开发 API 时,我陷入了困境。如何在 API(后端,使用 Django REST Framework 开发)和 React Native/React 中添加和处理诸如 csrf_token 之类的功能JS(前端)像 Django 模板一样?

最佳答案

第一步是获取 CSRF token ,可以从 Django csrftoken cookie 中检索该 token 。

现在来自Django docs您可以了解如何使用这个简单的 JavaScript 函数从 cookie 获取 csrf token :

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 token

var csrftoken = getCookie('csrftoken');

接下来,您可以在使用 fetch() 发送请求时使用此 csrf token ,方法是将检索到的 token 分配给 X-CSRFToken header 。

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

以 React 表单呈现 CSRF token :

如果您使用 React 来渲染表单而不是 Django 模板,您还需要渲染 csrf token ,因为 Django 标记 { % csrf_token % } 在客户端不可用,因此您需要创建一个高阶组件,使用 getCookie() 函数检索 token 并以任何形式呈现它。

让我们在 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;

Django CSRF Coo​​kie

React 动态渲染组件,这就是为什么如果您使用 React 渲染表单,Django 可能无法设置 CSRF token cookie。 Django 文档是这样说的:

If your view is not rendering a template containing the csrftokentemplate tag, Django might not set the CSRF token cookie. This iscommon in cases where forms are dynamically added to the page. Toaddress this case, Django provides a view decorator which forcessetting of the cookie: ensurecsrf_cookie().

为了解决这个问题,Django 提供了surecsrfcookie 装饰器,您需要将其添加到 View 函数中。例如:

from django.views.decorators.csrf import ensure_csrf_cookie

@ensure_csrf_cookie
def myview(request):

关于python - 如何在 Django RESTful API 和 React 中使用 csrf_token?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50732815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com