Mod_wsgi на Python 3.10 не обновляет шаблоны Django без перезапуска Apache
Я уже некоторое время запускаю сервер Django на Python 3.8 с Apache и mod_wsgi, и решил, что пришло время перейти на Python 3.10. Я установил Python 3.10 на свой сервер, установил пакеты Django и mod_wsgi, скопировал сборку mod_wsgi.so версии 3.10 в папку модулей Apache, и все отлично работает... однако, похоже, что с этой сборкой mod_wsgi изменения в файлах шаблонов не вступают в силу, пока я не перезапущу Apache.
В качестве примера я добавил на свой сайт произвольный файл шаблона HTML и запустил сервер с некоторым начальным текстом в этом шаблоне. Работая на Python 3.8, я могу изменить содержимое этого шаблона (например, echo "More Text" >> test_template.html
), и после обновления браузера новый текст отобразится. Однако при выполнении того же теста в версии 3.10 новый текст не появляется . Я пробовал разные сессии браузера и жесткую перезагрузку, это не проблема кэширования на стороне клиента, и просмотр размеров ответа в журнале доступа Apache подтверждает, что данные, отправляемые клиенту, изменяются в 3.8, но не в 3.10.
Я создал тестовый сервер, чтобы изолировать проблему, и свел ее к изменению сборки mod_wsgi (что, конечно, меняет всю версию Python, используемую Django). Тем не менее, это подтверждает, что дело не в настройках кэширования Apache или неправильной конфигурации шаблонов Django, и я выполнил шаги здесь , чтобы подтвердить, что я запускаю mod_wsgi в режиме демона (как я делал это годами на этом сервере, это давний сервер, настроенный, кажется, без проблем для Python 3.8).
Наконец, запуск сервера разработки Django (с помощью команды base manage.py runserver
) отражает изменения шаблона на лету без проблем и без перезагрузки сервера. Так что, насколько я могу судить, это похоже на причуду mod_wsgi.
Конкретные комбинации версий Apache | mod_wsgi | Python следующие:
Apache/2.4.41 (Ubuntu) mod_wsgi/4.6.8 Python/3.8
Apache/2.4.41 (Ubuntu) mod_wsgi/4.9.4 Python/3.10
... как сообщает журнал ошибок Apache, подтверждая, что модули загружаются, как ожидалось.
Кто-нибудь знает, является ли это известной проблемой для Python 3.10 сборки mod_wsgi? Возможно, есть новая настройка, которую я забыл? Я понимаю, что шаблоны Django всегда должны отражать изменения немедленно (без перезапуска сервера), однако изменения кода требуют перезапуска (или касания скрипта wsgi.py); до этого изменения мне никогда не приходилось перезапускать сервер для изменения шаблонов. Любая помощь будет принята с благодарностью-
Проблема, с которой вы столкнулись, когда изменения в шаблонах Django не вступают в силу, пока вы не перезапустите Apache после обновления до Python 3.10 с mod_wsgi 4.9.4, может быть связана с проблемой совместимости между новой версией Python и mod_wsgi. Поскольку mod_wsgi - это модуль Python, который предоставляет интерфейс WSGI для размещения веб-приложений на Python, таких как Django, возможно, что изменения в среде Python (например, обновление версии Python) могут вызвать изменения в поведении mod_wsgi.
Я бы рекомендовал проверить документацию mod_wsgi и примечания к выпуску на предмет проблем совместимости, связанных с Python 3.10, а также изменений в конфигурации mod_wsgi, необходимых для поддержки новой версии Python.
Дополнительно, вы можете попробовать запустить ваше приложение Django с mod_wsgi в режиме "embedded", так как это позволит вам протестировать окружение Python и любые связанные с ним проблемы без участия Apache. Для этого вы можете модифицировать ваш WSGI-скрипт для запуска в режиме embedded, как описано в документации mod_wsgi. Это позволит вам изолировать проблему и определить, является ли она специфичной для mod_wsgi или для вашей установки Apache.
В итоге я сделал сообщение в проекте mod_wsgi на github и отследил проблему до изменения поведения Django в этом коммите
Полные подробности этого поста можно найти здесь
Tl;dr; есть кэширующий загрузчик шаблонов, который раньше был включен только при установке DEBUG = False
, но был обновлен, чтобы всегда быть в действии. Я не уверен, почему в моей сборке Python 3.8 не было этого изменения, так как я обновил обе сборки до последней доступной сборки Django (4.6.1), но моя первоначальная установка была сделана много лет назад, так что вполне возможно, что свежая установка не имела бы этой проблемы.
Если вы все еще хотите отключить кэшированные шаблоны, как это сделал я, вам нужно переопределить загрузчики шаблонов в настройках Django:
TEMPLATES = [
{
'OPTIONS': {
'loaders': ['django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader']
},
},
]