在tab \ browser close上我需要将数据发送到服务器。我发现this answer(基于this blog)建议使用sendBeacon
。显示了如何准备数据以便通过Ajax将它们发送到服务器的Here。我重复了答案中的结构:
window.addEventListener('unload', this.sendDataToServer, false)
sendDataToServer () {
myData = JSON.stringify({
'mutation': `mutation EmailAuth($email: String!, $password: String!) {
getOrCreateUser(email: $email, password: $password) {
token
}
}
`,
'variables': {email: 'test@test.net', password: 'Test'}
})
navigator.sendBeacon('http://localhost:8000/graphql', myData)
}
在这种情况下,Django显示:"POST /graphql HTTP/1.1" 400 53
我还在互联网上找到了Blob
的版本:
window.addEventListener('unload', this.sendDataToServer, false)
sendDataToServer () {
let headers = {
type: 'application/json'
}
let myBlob = new Blob([JSON.stringify({
'mutation': `mutation EmailAuth($email: String!, $password: String!) {
getOrCreateUser(email: $email, password: $password) {
token
}
}
`,
'variables': {email: 'test@test.net', password: 'Test'}
})], headers)
navigator.sendBeacon('http://localhost:8000/graphql', myBlob)
}
但在这种情况下,根本没有任何Django的反应。
如何将前端的数据包装成GraphQL格式并将其放入sendBeacon
中,服务器端可以接受?
答案 0 :(得分:1)
使用按钮代替Blob
,找到unload
无效的原因。问题在于Chrome浏览器。控制台显示:Uncaught DOMException: Failed to execute 'sendBeacon' on 'Navigator': sendBeacon() with a Blob whose type is not any of the CORS-safelisted values for the Content-Type request header is disabled temporarily. See http://crbug.com/490015 for details.
Django正在等待application/json
类型的请求,根据link from error这不是安全的。
对于Firefox,可以使用Django的软件包corsheaders
解决此问题,并将CORS_ALLOW_CREDENTIALS = True
添加到设置中。