Django + WSGI: освежающие проблемы?

Я разрабатываю сайт Django. Я делаю все свои изменения на живом сервере, просто потому, что так проще. Проблема в том, что время от времени ему нравится кэшировать один из *.py файлы, над которыми я работаю. Иногда, если я часто нажимаю "обновить", он переключается между старой версией страницы и новой версией.

моя настройка более или менее похожа на то, что описано в учебниках Django: http://docs.djangoproject.com/en/dev/howto/deployment/modwsgi/#howto-deployment-modwsgi

Я гадание он делает это, потому что он запускает несколько экземпляров обработчика WSGI, и в зависимости от того, к какому обработчику отправляется http-запрос, я могу получить разные версии страницы. Перезапуск apache, кажется, исправить проблему, но это раздражает.

Я действительно мало знаю о WSGI или "промежуточном ПО" или любом из этих запросов занимаюсь делами. Я пришел из PHP-фона, где все это просто работает:)

в любом случае, что хороший способ решения этой проблемы? Будет ли запуск обработчика WSGI "режим демона" облегчить проблему? Если да, то как заставить его работать в режиме демона?

4 ответов


вы можете решить эту проблему, не редактируя код на рабочем сервере. Серьезно, этому нет оправдания. Разработайте локально, используя управление версиями, и, если необходимо, запустите сервер из Live checkout с крючком post-commit, который проверяет вашу последнюю версию и перезапускает Apache.


запуск процесса в режиме демона не поможет. Вот что происходит:

mod_wsgi порождает несколько идентичных процессов для обработки входящих запросов для вашего сайта Django. Каждый из этих процессов является собственным интерпретатором Python и может обрабатывать входящий веб-запрос. Эти процессы являются постоянными (они не выводятся и не уничтожаются для каждого запроса), поэтому один процесс может обрабатывать тысячи запросов один за другим. mod_wsgi способен обрабатывать несколько веб-запросы одновременно, так как существует несколько процессов.

интерпретатор Python каждого процесса будет загружать ваши модули (ваши пользовательские файлы Python) всякий раз, когда выполняется "модуль импорта". В контексте django это произойдет, когда новый view.py требуется из-за веб-запроса. Как только модуль загружен, он находится в памяти, и поэтому любые изменения, внесенные в файл, не будут отражены в этом процессе. По мере поступления новых веб-запросов интерпретатор Python процесса будет просто используйте версию модуля, которая уже загружена в память. Вы видите несоответствия между обновлениями, так как каждый веб-запрос, который вы делаете, может обрабатываться различными процессами. Некоторые процессы, возможно, загрузили модули Python во время предыдущих версий кода, в то время как другие, возможно, загрузили их позже (так как эти процессы не получили веб-запрос).

простое решение: в любое время, когда вы изменяете свой код, перезапустите процесс Apache. В большинстве случаев это так же просто, как работать как root из оболочки " / etc / init.D / apache2 restart". Я считаю, что простая перезагрузка также работает, что быстрее", / etc / init.д/apache2 не перезагрузки"

решение демона: если вы используете mod_wsgi в режиме демона, то все, что вам нужно сделать, это коснуться (команда unix) или изменить файл сценария wsgi. Уточнить scrompt.com сообщение, изменения в исходном коде Python не приведут к перезагрузке вашего кода mod_wsgi. Перезагрузка происходит только тогда, когда файл сценария wsgi имеет был изменен.

последнее замечание: я говорил только о wsgi как об использовании процессов для простоты. wsgi фактически использует пулы потоков внутри каждого процесса. Я не чувствовал, что эта деталь имеет отношение к этому ответу, но вы можете узнать больше, прочитав о mod_wsgi.


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

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

WSGIDaemonProcess example.com processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup example.com

прочитайте документацию mod_wsgi, а не полагаться на минимальную информацию для mod_wsgi хостинга, содержащегося на сайте Django. В partcular, читать:

http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode

Это говорит вам точно, как перезагрузка исходного кода работает в mod_wsgi, включая монитор, который вы можете использовать для реализации такого же рода перезагрузки исходного кода, что и Django runserver. Также посмотрите, что говорит о том, как применить это к Джанго.

http://blog.dscpl.com.au/2008/12/using-modwsgi-when-developing-django.html http://blog.dscpl.com.au/2009/02/source-code-reloading-with-modwsgi-on.html