2011-06-27 34 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

相关问题