Django предотвращает кеширование страниц

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

Я попробовал следующее в views.py

class ServiceCreate(LoginRequiredMixin, CreateView):
    model = Service
    form_class = ServiceCreateForm

    @method_decorator(never_cache)
    def dispatch(self, request, *args, **kwargs):
        return super(ServiceCreate, self).dispatch(request, *args, **kwargs)

Однако это не имеет никакого эффекта, поскольку вся страница отображается мгновенно, когда пользователь нажимает кнопку «Назад». Как я могу предотвратить кеширование, пожалуйста?

Обновить Я новичок в Django, поэтому подумал, что декоратор сообщит браузеру не кэшировать - я не оценил, что кэширование сервера также было.


person RunLoop    schedule 02.07.2015    source источник
comment
Похоже, проблема в кешировании браузера...   -  person NightShadeQueen    schedule 02.07.2015
comment
Поиск шаблона PRG. en.m.wikipedia.org/wiki/Post/Redirect/Get   -  person dani herrera    schedule 02.07.2015


Ответы (1)


То, что вы видите, не имеет ничего общего с кэшированием сервера — это все на стороне браузера.

В конечном счете, вы не можете на 100 % гарантировать, что форма не будет отправлена ​​несколько раз (пользователи найдут способ...), поэтому вам придется изящно обрабатывать это на сервере. Однако вы можете значительно снизить вероятность этого:

  • Верните HttpResponseRedirect (или используйте redirect ярлык) для перенаправления браузера после успешной формы подчинение. Это предотвратит повторную отправку формы при обновлении браузера.

  • Используйте javascript, чтобы отключить кнопку отправки формы после отправки формы. Недавно у меня были некоторые странные ошибки и несоответствия данных, которые, как выяснилось, были вызваны тем, что кто-то дважды щелкнул кнопку отправки формы. Отключение кнопки после первого щелчка решило проблему (наряду с дополнительной проверкой на стороне сервера для распознавания повторяющейся отправки).

  • Убедитесь, что вы используете POST (а не GET) для отправки формы. Браузеры менее склонны повторно отправлять форму случайно, и я считаю, что защита Django от CSRF должны также предотвращать отправку с ошибками.

person dgel    schedule 02.07.2015
comment
Спасибо за подробный ответ. Я думаю, что ваше второе предложение об отключении кнопки отправки будет лучшим. - person RunLoop; 03.07.2015