Django:有没有办法阻止视图同时被调用两次?

时间:2011-06-27 21:21:49

标签: python django

我们的Django应用程序上有一些功能,它显示了一个链接,可以从我们的版本控制系统中刷新一些信息。这只是一个链接,当他们点击该URL时,将执行进行版本控制,获取信息,检查数据库和更新数据库的操作。

最近我们让用户点击两次“刷新”按钮获取一个资产。这导致URL被命中两次,因此操作执行了两次,最终在我们的数据库中创建了重复的条目。

我们需要做一些事情来消除用户点击该按钮两次的可能性。我们应该从链接转到javascript按钮吗?我们应该在第一次点击发生时立即在request.session中设置一些标志,然后在完成后取消设置,并在执行刷新时始终检查该标志?这些只是两个似乎可行的想法,但我真的不知道。

3 个答案:

答案 0 :(得分:4)

您应该使用POST请求并在其后重定向。

另外,为防止双重提交,您可以使用此问题中的解决方案:Does a library to prevent duplicate form submissions exist for django?。您可以在refreshing_vcs中存储密钥request.session并在视图中检查其值。如果数据已经刷新,那么您可以将用户重定向到另一个页面并告诉稍等。

完全另一种方法是设置django-celery任务(或简单地使用cron)自动定期执行更新,但我不知道它是否符合您的要求。

答案 1 :(得分:0)

这是最佳解决方案,但您可以通过向按钮添加禁用属性等于'true'来禁用按钮onclick

使用jQuery: $('#yourButtonId')。attr(“disabled”,true);

答案 2 :(得分: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.网址

相关问题