идентификатор сессии изменяется при использовании redirect () в View - PullRequest
4 голосов
/ 05 августа 2011

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

В попытке решить проблему «Страница устарела» в IE я использую так называемый шаблон PRG (http://en.wikipedia.org/wiki/Post/Redirect/Get)., поэтому я возвращаю django.shortcuts.redirect () из метода post () моего представления, которое перенаправляет на тот же URL.

Проблема заключается в том, что в производственном процессе я вижу разные идентификаторы сеанса, связанные с запросами GET, отправленными после ответа 302. И так как я сохраняюмоя форма в сеансе, чтобы иметь возможность разделить результаты на страницы, я получаю противоречивые результаты.

Я запускаю django под apache / mod_wsgi. apache настроен для запуска максимум 3 процессов.

Это не происходит сразу после перезапуска httpd, и кажется, что оно начинает происходить после того, как объем памяти, потребляемой процессами httpd, достигает некоторого предела.

Я проверяю это, многократно нажимая кнопку отправки, форма получаетзаполнен из сеанса, чтобы я мог видеть строки поиска, которые я ввел. при изменении сеанса формаперевернутый бланкпоэтому, когда это начинает происходить, форма успешно заполняется 2 раза подряд, а когда я нажимаю «отправить» в третий раз, она возвращает пустое значение, что означает, что сервер вернул новые сеансовые куки.похоже, это как-то связано с настройкой ServerLimit.

Что не так?Есть идеи?

спасибо

Константин

Ответы [ 3 ]

1 голос
/ 16 августа 2011

Вы пытались использовать HTTP 303 См. Другой ответ вместо 302?

http://tumblr.jonthornton.com/post/7902581999/preventing-form-re-submission-with-http-303-redirects

1 голос
/ 17 августа 2011

Вы используете правильное приложение Django Sessions?

Если это так, то он сохраняет текущий идентификатор сеанса в файле cookie, имя которого указано в параметре SESSION_COOKIE_NAME, и по умолчанию используется sessionid. Так как вы не сталкиваетесь с этой проблемой в Firefox, я считаю, что можно с уверенностью предположить, что ваша обработка сессий и хранение в Django работает нормально.

Наиболее вероятным виновником здесь является то, что IE теряет / удаляет cookie-файл sessionid, заставляя его начать новый сеанс после перенаправления. Быстрый Google на предмете, кажется, подтверждает это.

Некоторую информацию можно найти по адресу:

Теперь, чтобы действительно решить вашу проблему. Django не устанавливает cookie-файл сеанса, если он действительно не нужен (т.е. если вы устанавливаете Session Data). Если единственное место, в которое вы устанавливаете данные сеанса, находится в представлении, когда вы выполняете POST, то IE откажется от файла cookie, устанавливающего идентификатор сеанса.

Таким образом, быстрая и простая попытка заключается в том, чтобы просто сохранить некоторые ненужные данные (или значения по умолчанию?) В сеансе во время GET, чтобы отобразить форму, исходную перед POST, при этом IE получит cookie-файл sessionid, и все должно работа.

0 голосов
/ 05 августа 2011

IE открывает новое соединение, когда получает перенаправление 302. Вот почему 302 решает проблему с вашей страницей, срок действия которой истек. Но это также означает, что вы служите новой "сессии".

Вам понадобится какой-то другой механизм для отслеживания сеанса через 302, кроме зависимости от соединения.

...