【发布时间】:2020-11-20 09:50:01
【问题描述】:
我正在构建一个 django-react 应用程序,使用 Django 呈现模板,用于 api 端点的 Django REST 框架,以及在 django 模板之上的 React。
我正在使用'rest_framework.authentication.SessionAuthentication',并且我已经实现了身份验证路由,但是 django 的内置身份验证方法(login、logout、authenticate)似乎只适用于 django 呈现的模板,而不适用于 React 组件。我的意思是如果我有这样的观点
def home_page(request, *args, **kwargs):
print("local USER >>>", request.user)
print("local SESSION >>>", request.session)
return render(request, 'pages/homepage.html',
{}, status=200)
我登录后访问路由,它会打印出user 和session 对象。
但是对于 api 视图,
@api_view(['GET', 'POST'])
@permission_classes([IsAuthenticatedOrReadOnly])
def post_list_view(request, *args, **kwargs):
print("api USER >>>", request.user)
print("api SESSION >>>", request.session)
...
即使我已登录,我也会收到 AnnonymousUser 和 None。
当我检查浏览器 cookie 时,我发现了 csrftoken 和 sessionid cookie。
但是,如果我尝试发布请求,则会收到 403 Forbidden 错误,并显示“未提供身份验证凭据”。信息。 (我还将withCredentials 设置为true。)在请求标头中只有X-CSRFToken 标头(带有令牌),但缺少sessionid cookie。
在这一点上,我只是不知道下一步该做什么。我应该手动设置会话cookie吗?或者,我应该自定义内置方法吗? (如果是这样,请告诉我我该怎么做。) 我在这里做错了什么,我该如何解决?
编辑:
POST 请求的axios 配置:
const options = {
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'X-CSRFToken': csrftoken
},
withCredentials: true
};
axios.post(url, data, options)
.then(response => {
console.log(response);
commentInput.current.value = '';
})
.catch(error => console.log(error));
【问题讨论】:
-
你应该在每次向你的 Django 服务器发出请求时发送会话 cookie
标签: reactjs django authentication django-rest-framework