使用vuejs和django restframework和restauth的django webpack loader的身份验证问题

使用vuejs和django restframework和restauth的django webpack loader的身份验证问题,django,vue.js,webpack,django-rest-framework,django-rest-auth,Django,Vue.js,Webpack,Django Rest Framework,Django Rest Auth,我使用vue cli和webpack使用vue.js创建了一个前端,使用django restframework创建了一个后端,在这里,我还使用restauth为google实现了社会身份验证。在我使用django网页包之前,登录和注销都可以正常工作,正如预期的那样。(我应该提到我使用的是tokenauthentication)在我的settings.py文件中,我在restframework身份验证中启用了sessionauthentication和tokenauthentication。启用

我使用vue cli和webpack使用vue.js创建了一个前端,使用django restframework创建了一个后端,在这里,我还使用restauth为google实现了社会身份验证。在我使用django网页包之前,登录和注销都可以正常工作,正如预期的那样。(我应该提到我使用的是tokenauthentication)在我的settings.py文件中,我在restframework身份验证中启用了sessionauthentication和tokenauthentication。启用的两个设置从未引起任何问题。但是,在使用django webpack loader使用django模板呈现前端vue文件后,我会不断收到一个错误,说我的csrf令牌不存在。不过,如果我从settings.py文件中删除了sessionauthentication选项,那么在这种情况下登录就可以正常工作

有人知道为什么会这样吗

我使用上面的博客实现了webpack加载程序的功能

在使用django网页包加载程序后,我从my settings.py中删除了“rest_framework.authentication.SessionAuthentication”行,问题得到了解决

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authtoken',
    'rest_framework.authentication.BasicAuthentication',
    'rest_framework.authentication.SessionAuthentication',
)
}
我基本上是这样改变的:

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authtoken'
    'rest_framework.authentication.BasicAuthentication',

)
}

由于您可能正在使用axios,因此需要在
main.js中包含这两行代码

/* configure axios to forward the csrftoken back to Django on POST requests */
axios.defaults.xsrfHeaderName = 'X-CSRFToken';
axios.defaults.xsrfCookieName = 'csrftoken';

嘿这成功了!但是,您能告诉我为什么我需要添加此代码以使其工作,但在我没有使用webpack loader且应用程序似乎工作正常时不需要这样做吗?也许您没有在axios上使用POST请求?这与网页包加载器无关。这与使用axios发出请求有关。通过这些设置,您告诉axios读取xsrf cookie(Django用于发送cookie的名称),并将其值作为头包含在所有发送的请求中。我以前也使用过axios。因此,我只能猜测,这个问题是在使用django webpack loader之后发生的,因为django会呈现vue文件本身,并创建一种代理路由,以便我的vue.js文件呈现在与django运行的本地主机端口相同的本地主机端口上。这可能是一个原因,甚至接近于对此的解释吗?如果在使用django webpack loader之前,您直接使用webpack在不同的端口中为前端文件提供服务,那么是的,您的请求使用“令牌身份验证”进行身份验证(因为会话身份验证仅在同一端口下工作)Django甚至没有尝试使用会话身份验证。