2011-06-27 37 views
3

我們的Django應用程序上有一些功能,顯示一個鏈接來刷新我們版本控制系統的一些信息。這只是一個鏈接,當他們訪問該URL時,將執行版本控制,獲取信息,檢查數據庫並更新數據庫等操作。Django:有沒有辦法阻止視圖被同時調用兩次?

最近我們有一個用戶爲一個資產點擊兩次'刷新'按鈕。這導致URL被擊兩次,所以這些操作被執行了兩次,最終在我們的數據庫中創建了一個重複的條目。

我們需要做些什麼來消除用戶單擊該按鈕兩次的可能性。我們應該從一個鏈接轉移到一個JavaScript按鈕?一旦第一次點擊發生,我們是否應該在request.session中設置一些標誌,然後在完成時取消設置,並且在執行刷新時始終檢查該標誌?這些只是兩個看起來可行的想法,但我真的不知道。

+2

爲什麼一個頁面請求,從而導致數據庫條目?我猜這不是一個POST。 –

+0

糟糕。這是我們的第一個Web應用程序,但我應該抓住了這一點。是的 - 這是一個get。有一個列可以生成一個'視圖'鏈接(如果我們的數據庫是最新的VC)或'刷新'鏈接(如果我們的數據庫不是最新的VC)。 'view'顯然是GET,但'refresh'應該是POST。這是否意味着它是一個鏈接的模式將無法正常工作? – Nathan

回答

4

你應該使用POST請求並在它之後重定向,真的。

此外,爲防止雙重提交,您可以採用類似於此問題的解決方案:Does a library to prevent duplicate form submissions exist for django?。您可以將密鑰refreshing_vcs存儲在request.session中,並在您的視圖中檢查其值。如果數據已被刷新,那麼您可以將用戶重定向到另一頁並告訴稍等一會。

完全的另一種方法是設置一個django-celery任務(或簡單地使用cron)來自動執行定期更新,但我不知道它是否符合您的要求。 。

+0

是的,我們在這裏錯誤地使用GET。更改爲POST並向會話添加標誌看起來就像解決方案。謝謝! – Nathan

0

這是最好的解決辦法,但你可以的onclick通過添加禁用的屬性按鈕等於「真」

使用jQuery禁用按鈕: $(「#yourButtonId」)ATTR(「已禁用」 ,真);

0
from django.views import View 
from django.shortcuts import render, redirect 

class MyView(View): 
    def get(self, request): 
     return render(request, 'get.html') 
    def post(self, request): 
     # handle your post here 
     # maybe you had a form that was filled, handle it here 
     # then instead of returning a HttpResponse 
     # use a redirect, that way, a refresh won't result in the 
     # post method been called twice. 
     # note if you want, you can also safely redirect to the same view 
     return redirect('/my-login-view') 

looking at the django code重定向功能參數可以是:
1.模型
2.視圖名稱或
3. URL

相關問題