这是原始问题:
在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'
我该如何解决?
答案 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.
})
它将起作用。