среда, 28 октября 2009 г.

Django+Eclipse. Autoreload Django сервера в Debug режиме.

При работе Eclipse+Django(как начать работать было описано в статье Интелисенс Eclipse в Django проектах) я столкнулся с проблемой в том, что при изменении файла настроек приходилось перезапускать сервер для применения изменений.

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

Больше всего возмутила не сама проблема, а бестолковые ответы, это и дало неплохой стимул для поиска решений. Через 30 минут я наткнулся на одно интересное решение "How to debug django web application with autoreload.", которое было основано на возможности удаленной отладки PyDev. Комментарий добавил в форум, а сейчас хотел бы написать о полном цикле решения этой проблемы, про это и пойдет дальше речь.

1. Плагин PyDev


Если вы пользуетесь плагином PyDev до версии 1.5, то вам необходимо будет установить дополнительно решение PyDev extension, полный список версий можно найти в следующих архивах.

Я бы порекомендовал установить версию 1.5 или выше, так как с этой версии данный проект перешел в open source и PyDev extension интегрирован в PyDev. Если вы решили установить новую версию, то сначала удалите старую(Меню "Help"->"Software Updates...", вкладка "Installed Software", выбрать плагин, нажать кнопку "Uninstall..."), дальше устанавливаем новый плагин. Новую версию плагина можно скачать с сайта SourgeForce или настроить автообновление в Eclipse - http://pydev.org/updates.

2. Подключение pydevd.py


Для установки точек прерывания к проекту необходимо подключить исходники модуля pydevd, который находится в плагине PyDev. Для моей версии его можно найти по следующему пути: e:\Eclipse\plugins\org.python.pydev.debug_1.5.0.1251989166\pysrc\pydevd.py

Подключить папку с этим фалом можно двумя способами:

1. Подключение папки в проекте. Для этого нужно вызвать контекстное меню проекта, меню "Properties", закладка "PyDev - PYTHONPATH", таб "External Libraries" и с помощью кнопки "Add source folder" прописать путь.
2. Подключение папки в настройках плагина PyDev. Для этого нужно вызвать меню "Window"->"Preferences"->"PyDev"->"Interpreter Python", таб "Libraries" и с помощью кнопки "New Folder" добавить путь к файлу.
После этих манипуляций у вас в проекте будет доступен модуль pydevd. При работаете с несколькими проектами, если вы воспользуетесь первым вариантом, то вам необходимо будет выполнить такие действия для каждого проекта, если вторым, то будет достаточно выполнить настройки для каждого экземпляра Eclipse.

3. Запуск PyDev server


Для удаленной отладки вам понадобится запустить PeDev server. В версиях PeDev до 1.5 он был доступен только c PyDev extension, в версии 1.5 и выше - доступен непосредственно в плагине PyDev. Иконку запуска сервера можно найти только в Debug перспективе, поэтому входим в данную перспективу и находим иконку "PyDev:Start PyDev Server", нажимаем ее для запуска.
После запуска в консоли у вас появится следующие сообщение:

4. Установка точек остановки


Для установки точки прерывания нужно прописать следующий код:
import pydevd;pydevd.settrace();

Данное решение не очень практичное, поэтому воспользуемся решением от bear330. Для этого файл manage.py изменим следующим образом:

from django.core.management import execute_manager
import sys
try:
    import settings # Assumed to be in the same directory.
except ImportError:
    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
    sys.exit(1) 

#Magic by bear330. http://bear330.wordpress.com/2007/10/30/how-to-debug-django-web-application-with-autoreload/
if len(sys.argv) > 1:
    command = sys.argv[1]
if settings.DEBUG and (command == "runserver" or command == "testserver"):
    # Make pydev debugger works for auto reload.
    try:
        import pydevd
    except ImportError:
        sys.stderr.write("Error: " +
            "You must add org.python.pydev.debug.pysrc to your PYTHONPATH.")
        sys.exit(1)

    from django.utils import autoreload
    m = autoreload.main
    def main(main_func, args=None, kwargs=None):
        import os
        if os.environ.get("RUN_MAIN") == "true":
            def pydevdDecorator(func):
                def wrap(*args, **kws):
                    pydevd.settrace(suspend=False)
                    return func(*args, **kws)
                return wrap
            main_func = pydevdDecorator(main_func)
        return m(main_func, args, kwargs)

    autoreload.main = main
    
if __name__ == "__main__":
    execute_manager(settings)


И в нужном месте установим точку остановки.

Запускаем сервер Django через Eclipse


На последнем шаге необходимо запустить сервер Django через Eclipse. Для этого входим в меню "Run"->"Run Configurations"->"Python run", вызвав контекстное меню на этом пункте, создаем новую конфигурацию. В табе "Main" для поля "Project" указываем свой проект, "Main module" устанавливаем в "manage.py". В табе "Arguments" для поля "Program arguments" задаем "runserver 8080".
Жмем "Run" и наслаждаемся отладкой. Необходимо некоторое время, чтобы PeDev server подсоединился к потоку Django server-а, у меня это происходит примерно за 7 сек.
Не обошлось без ложки дегтя, в некоторых ситуациях перестают отрабатывать точки остановки :(. Решение оказалось очень простым, добавляем пробел и сохраняем файл. Происходит рестарт Django сервера и PyDev сервер снова автоматически подхватывает поток, все отлично начинает работать.

3 комментария:

  1. Этот комментарий был удален администратором блога.

    ОтветитьУдалить
  2. Этот комментарий был удален автором.

    ОтветитьУдалить