Я запускаю Django через mod_python на Apache в Linux. У меня есть собственный сервер аутентификации и промежуточное ПО, которое требует аутентификации для всех страниц, кроме статического содержимого.
Моя проблема в том, что после входа в систему я все равно время от времени буду случайным образом получать экран входа в систему. Мне кажется, что у каждого процесса apache есть собственный процесс python, который, в свою очередь, имеет свои внутренние компоненты. Итак, пока меня обслуживает тот же процесс, в который я вошел, все в порядке. Но если мой запрос обслуживается другим процессом apache, я больше не аутентифицируюсь.
Я проверил заголовки HTTP, которые отправляю с помощью FireBug, и они каждый раз одинаковы, т.е. тот же файл cookie.
Это известная проблема и есть ли обходные пути / исправления?
Обновлено: у меня есть страница, на которой отображается много сгенерированных изображений. Некоторые из них не отображаются. Это связано с тем, что они слишком отстают от промежуточного программного обеспечения для аутентификации, поэтому они случайным образом размещают образ для входа. Однако, обновив эту страницу достаточно раз, она в конечном итоге сработает, а это означает, что все процессы распознают мою сессию.






У вас есть стандартные сеансы, управляемые базой данных? Кеширование включено в настройках?
Та же ошибка как для стандартных, так и для файловых сеансов. Кеширование не включено.
Вы правы в отношении того, как Apache обрабатывает процессы, и иногда вас обслуживает другой процесс. Вы можете увидеть это, когда внесете изменения в свой сайт; новые процессы сохранят изменения, но старые процессы предоставят вам старый сайт. Чтобы добиться согласованности, вам нужно перезапустить Apache.
Предполагая, что перезапуск не решит проблему, я бы предположил, что это что-то в «бэкэнде пользовательской аутентификации», хранящем часть аутентификации в памяти (что не очень хорошо работает для веб-сервера). Я бы попытался установить MaxRequestsPerChild на 1 в конфигурации Apache и посмотреть, отображается ли по-прежнему экран входа в систему. Если вы это сделаете, что-то сохраняется в памяти, возможно, модель не сохраняется?
Надеюсь, это поможет!
P.S. Просто из любопытства, почему вы используете настраиваемый бэкэнд аутентификации и промежуточное программное обеспечение, чтобы гарантировать, что пользователь вошел в систему? Кажется, contrib.auth и @login_required Django было бы проще ...
Мне нужно пройти аутентификацию в активном каталоге, следовательно, у меня есть собственный сервер аутентификации. В памяти ничего не хранится. Я не использую @login_required, потому что это для интрасети, доступной извне, и я не верю себе, что не забываю помещать это во все представления
Что делает установка MaxRequestsPerChild на 1?
Извините, мне не удалось это проверить, и теперь я не смогу это сделать до понедельника. Спасибо хоть за совет, попробую.
Я настоятельно рекомендую вам не устанавливать MaxRequestsPerChild в 1, так как это вызовет столько накладных расходов, так как каждый процесс будет завершен и возрождается с каждым запросом.
Вы используете apache preform MPM или worker MPM?
Взгляните на http://docs.djangoproject.com/en/dev/howto/deployment/modpython/?from=olddocs, который может вам помочь
Если вы используете некоторые глобальные переменные для хранения данных вашего пользовательского сеанса аутентификации, вам необходимо изменить это, чтобы использовать файл, базу данных или memcached. Как указано выше, mod_python запускает несколько процессов, и между ними нет общей памяти.
Я рекомендую использовать для этого memcached, а также использовать файлы cookie для хранения идентификатора сеанса или передать его в качестве параметра GET, чтобы позже вы могли легко извлечь данные сеанса из кеша.
Как убедиться, что сеанс не очищается после перезапуска Apache (или остановки и запуска)?
Потому что, когда я обновляю исходный код и перезапускаю Apache, я обновляю веб-страницу, и мне нужно снова войти в систему. Сессия потеряна.
Сессия хранится в Memcache. Не знаю, как и почему его очистили. Как сохранить сеанс, чтобы пользователю не приходилось входить в систему после перезапуска apache?
После некоторой пробежки все кажется более стабильным. Однако мне не нравится, насколько это нестабильно. Возможно, мне нужно несколько раз сбросить apache и дать ему поработать несколько минут, прежде чем все заработает стабильно.