Django, mod_python, apache и дурацкие сессии

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

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

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

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

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

После некоторой пробежки все кажется более стабильным. Однако мне не нравится, насколько это нестабильно. Возможно, мне нужно несколько раз сбросить apache и дать ему поработать несколько минут, прежде чем все заработает стабильно.

Staale 03.10.2008 15:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
1 339
5

Ответы 5

У вас есть стандартные сеансы, управляемые базой данных? Кеширование включено в настройках?

Та же ошибка как для стандартных, так и для файловых сеансов. Кеширование не включено.

Staale 03.10.2008 16:21

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

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

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

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

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

Staale 03.10.2008 16:23

Что делает установка MaxRequestsPerChild на 1?

tghw 03.10.2008 19:54

Извините, мне не удалось это проверить, и теперь я не смогу это сделать до понедельника. Спасибо хоть за совет, попробую.

Staale 03.10.2008 23:04

Я настоятельно рекомендую вам не устанавливать 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?

Другие вопросы по теме