2013-07-12 22 views
1

我不確定它是關於django,而是javascript和瀏覽器。Django中的會話被JS更改時有什麼不對嗎

我的觀點:

def set_lang(request, lang): 
    request.session['lang'] = lang 

    # request.session.modified = True # optional, to be pretty sure 
    # request.session.save() # the same 

    return HttpResponse('ok') 
在HTML

,在JS:

$.post('/set_lang', {'lang', 'EN'}); # it change session and works 
location.reload() 

而地方location.reload()Django的會話 「rollbacked」 到以前的狀態。

在Chrome上添加自己的睡眠方法js(1秒)之前location.reload它的工作原理 在Firefox上存在問題。

我不使用cookie,除了會話一。 我試着清理瀏覽器緩存,會話,但沒有成功。 我可以在不同的瀏覽器版本上重複這一點。

我有解決方法,但我很好奇發生了什麼事。

當我從js location.reload()中刪除,然後執行POST/GET請求將正確處理會話。

F5 refresh set_lang之後也一直有效(會話正確更改)。

我比較location.reloadF5 refresh之間的http標題,它們是相同的。

+1

當你做'返回HttpResponse('ok')'它不會鬆動上下文嗎?我會嘗試'返回HttpResponse(request.session)'看看它打印什麼 – karthikr

+0

不,set_lang的作品,我可以返回改變的會話,會話在下一個請求丟失('location.reload()',只有這個) –

回答

0

它看起來像location.reload犯規讓$.post

$.post(url, data); 
// sleep(2000) // own func with timeout works only in chrome for me 
location.reload(); 

我問自己,如果發佈有足夠的時間來發送和jQuery.post docs

找到解決方案時,我更改代碼:

$.post(url, data).done(function(data{window.location.reload();}) 

它現在適用於每個瀏覽器:)

相關問題