Джанго: Есть ли способ предотвратить одновременный вызов представления дважды? - PullRequest
3 голосов
/ 28 июня 2011

В нашем приложении Django есть некоторые функции, которые отображают ссылку для обновления информации из нашей системы контроля версий.Это просто ссылка, и когда они попадают на этот URL, выполняются действия по переходу на управление версиями, получение информации, сверку ее с базой данных и обновление базы данных.

Недавно у нас был пользователь, дважды нажимавший кнопку «обновить» для одного актива.Это привело к двойному обращению к URL, поэтому операции были выполнены дважды, и в итоге в нашей базе данных была создана дублирующаяся запись.

Нам нужно что-то сделать, чтобы исключить возможность двойного нажатия этой кнопки пользователем.Должны ли мы перейти от ссылки на кнопку JavaScript?Должны ли мы установить какой-либо флаг в request.session, как только произойдет первый щелчок, затем сбросить его после завершения и всегда проверять этот флаг при выполнении обновления?Это всего лишь две идеи, которые кажутся осуществимыми, но я действительно не знаю.

Ответы [ 3 ]

4 голосов
/ 28 июня 2011

Вы должны использовать POST запрос и перенаправлять после него, действительно.

Кроме того, чтобы предотвратить двойную отправку, вы можете использовать решение, подобное одному из этого вопроса: Есть ли библиотека для предотвращения дублированияформы представления существуют для django? .Вы можете сохранить ключ refreshing_vcs в request.session и проверить его значение на ваш взгляд.Если данные уже обновляются, вы можете перенаправить пользователя на другую страницу и попросить немного подождать.

Совершенно другим способом было бы настроить задачу django-celery (или просто использовать cron) для выполнения обновлений.с регулярными интервалами автоматически, но я не знаю, соответствует ли это вашим требованиям.

0 голосов
/ 02 февраля 2017
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')

глядя на код django аргументы функций перенаправления могут быть:
1. Модель
2. Имя вида или
3. URL

0 голосов
/ 29 января 2014

Это лучшее решение, однако вы можете отключить нажатие кнопки, добавив в нее отключенный атрибут, равный 'true'

С помощью jQuery: $ ('# yourButtonId'). attr ("отключено", true);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...