我正在尝试使用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请求:
它确实成功运作。
当我从UI和JS发出请求时,请求标头中的唯一区别是:
Accept
,Content-Length
和Referer
,我看不出它们有什么问题。
请帮忙。
答案 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
。
有效。
希望这有助于将来的某些人。