Django React Axios

时间:2018-03-25 15:36:16

标签: django reactjs axios

我正在尝试使用React和Axios向Django服务器发送帖子请求。但是,我在服务器端获得了重定向302。

在这篇帖子中跟踪了所有建议CSRF with Django, React+Redux using Axios 不成功:(

但是,到目前为止我所做的是以下内容: 坐在默认的axios CookieName和HeaderName(在javascript端):

axios.defaults.xsrfHeaderName = "X-CSRFToken";
axios.defaults.xsrfCookieName = "XCSRF-Token";

settings.py中也有这个:

CSRF_COOKIE_NAME = "XCSRF-Token"

以下是帖子请求的样子:

axios(
    {
        method: 'post',
        url: `/api/${selectedEntryType}_entry`,
        data: {
            "test": "test"
        },
        headers: {
            'X-CSRFToken': document.cookie.split('=')[1],
            'X-Requested-With': 'XMLHttpRequest',
            'Content-Type': 'application/json',
        }
    }
)

我尝试的另一件事是从Django rest api UI发出post请求: Django rest api UI

它确实成功运作。

当我从UI和JS发出请求时,请求标头中的唯一区别是: AcceptContent-LengthReferer,我看不出它们有什么问题。

请帮忙。

1 个答案:

答案 0 :(得分:6)

通过更改我发布的网址(url:'/en/api/endpoint/')来管理修复它,因为显然是为了POST请求:

  

您通过POST调用此URL,但URL不以斜杠结尾,并且您设置了APPEND_SLASH。在保持POST数据时,Django无法重定向到斜杠URL。将表单更改为指向127.0.0.1:8000/en/api/endpoint/(注意斜杠),或在Django设置中设置APPEND_SLASH = False

之后我开始获得Forbidden 403,但添加:

from django.views.decorators.csrf import csrf_protect
from django.utils.decorators import method_decorator

@method_decorator(csrf_protect)
def post(self, request):
    return Response()

并且还将JS中的默认值更改为:

axios.defaults.xsrfHeaderName = "X-CSRFToken";
axios.defaults.xsrfCookieName = "csrftoken";

并从CSRF_COOKIE_NAME = "XCSRF-Token"移除了settings.py

有效。

希望这有助于将来的某些人。