为什么vue-resource没有在XHR中发送cookie,所以会话不起作用?

时间:2018-07-18 10:06:20

标签: python django rest web

这是原始问题:

  

在Django中,如果视图函数具有csrf_exempt装饰,如何使会话正常工作?

我使用Django作为Restful API,发现如果视图具有csrf_exempt装饰,则会话将无法正常工作。

以下是一些代码:

@csrf_exempt
def scorer_login(request):
    request.session['username'] = request.POST['username']

我发现在其他视图中打印request.session.get('username')时,request.session根本没有改变。

但是,如果没有csrf_exempt,它将起作用:

def scorer_login(request):
    request.session['username'] = 'test_username'

我该如何解决?

1 个答案:

答案 0 :(得分:0)

事实证明,它与后端无关。导致问题的是vue资源。

我发出的发帖请求是:

this.$http.post('http://localhost:8000/scorer/signin', {
    'username': this.username,
    'password': this.password
}, {emulateJSON: true}).then( response => {
     return response.json();
}).then( json => {
    // some other stuff.
})

实际上,浏览器中的cookie 根本没有发送。结果,后端未收到“ sessionid”,并且无法访问会话。这就是Django中的会话无法正常工作的原因。

要解决此问题,XHR中有一个名为“ withCredential ”的选项,它将使浏览器发送cookie。

然后代码变为:

this.$http.post('http://localhost:8000/scorer/signin', {
    'username': this.username,
    'password': this.password
}, {emulateJSON: true, withCredentials: true}).then( response => {
     return response.json();
}).then( json => {
    // some other stuff.
})

它将起作用。