Django, mod_python, apache и дурацкие сессии - PullRequest
1 голос
/ 03 октября 2008

Я запускаю Django через mod_python на Apache на компьютере с Linux. У меня есть пользовательский сервер аутентификации и промежуточное ПО, которое требует аутентификацию для всех страниц, кроме статического контента.

Моя проблема в том, что после того, как я войду в систему, я все равно буду случайным образом получать экран входа в систему время от времени. Мне кажется, что каждый процесс Apache имеет свой собственный процесс Python, который, в свою очередь, имеет свои внутренние механизмы. Так что, пока меня обслуживает тот же процесс, в который я вошел, все в порядке и превосходно. Но если мой запрос обрабатывается другим процессом apache, я больше не аутентифицируюсь.

Я проверил заголовки HTTP, которые я отправляю с FireBug, и они каждый раз одинаковы, т.е. то же самое печенье.

Это известная проблема, и есть ли обходные пути / исправления?

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

Ответы [ 5 ]

2 голосов
/ 03 октября 2008

Вы правы в том, как Apache обрабатывает процессы, и иногда вас обслуживает другой процесс. Вы можете увидеть это, когда вносите изменения в свой сайт; новые процессы примут изменения, но старые процессы дадут вам старый сайт. Чтобы получить согласованность, вы должны перезапустить Apache.

Предполагая, что перезапуск не решает проблему, я предполагаю, что это что-то в «пользовательском бэкэнде аутентификации», хранящем часть аутентификации в памяти (что не очень хорошо работает для веб-сервера). Я бы попробовал установить MaxRequestsPerChild в 1 в вашей конфигурации Apache и посмотреть, по-прежнему ли вы получаете экран входа в систему. Если вы это делаете, то что-то хранится в памяти, может быть, модель не сохраняется?

Надеюсь, это поможет!

P.S. Просто из любопытства, почему вы используете пользовательский сервер аутентификации и промежуточное ПО для обеспечения входа пользователя в систему? Кажется, что Django contrib.auth и @login_required было бы проще ...

0 голосов
/ 12 февраля 2013

Как обеспечить, чтобы сессия не очищалась после перезапуска Apache (или остановки и запуска)?

Потому что, когда я обновляю свой исходный код и перезагружаю Apache, я обновляю веб-страницу, и там мне нужно снова войти в систему. Сессия потеряна.

Сессия сохраняется в Memcache. Не знаю, как и почему его очистили. Как сохранить сеанс, чтобы пользователю не нужно было входить в систему после перезагрузки apache?

0 голосов
/ 31 марта 2009

Если вы используете некоторые глобальные переменные для хранения данных вашего пользовательского сеанса аутентификации, вам нужно изменить это, чтобы использовать файл, базу данных или memcached. Как указано выше, mod_python запускает несколько процессов, и между ними нет общей памяти.

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

0 голосов
/ 05 октября 2008

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

Используете ли вы Apache MPM или рабочий MPM?

Взгляните на http://docs.djangoproject.com/en/dev/howto/deployment/modpython/?from=olddocs, который может вам помочь

0 голосов
/ 03 октября 2008

Есть ли у вас стандартные сеансы на основе базы данных? Включено ли кэширование в настройках?

...