27 октября 2009 г.

Дебагинг django в eclipse c помощью PyDev

Pydev в сентябре переехал. Да еще его расширения стали Open Source:
Pydev Extensions is now merged with Pydev, and its once closed source code has become open source. Thus, there is no more Pydev Extensions, only the open source Pydev, with all the capabilities of Pydev Extensions incorporated.


Изменился и сайт апдейта для eclipse - http://pydev.org/updates .

А что нам это дает? А это нам дает бесплатную штуку под названием "Debug 'server' for remote debugging", с помощью которой можно дебажить django очень удобным способом.

Для начала выполняем условия, как написано здесь, в том числе заносим в PYTHONPATH в настройках Eclipse путь примерно следующего содержания
"eclipse\plugins\org.python.pydev.debug_1.5.0.1251989166\pysrc\" (найдете у себя подобный) и запускаем сервер (из перспективы debug):



Добавляем следующий код в manage.py (после if __name__ == "__main__":) проекта, что дает нам возможность обернуть PyDev брейкпоинты в pydevd.settrace(), который пересылает трейс Debug Remote серверу (для теста рекомендую сначала использовать --noreload и pydevd.settrace(), и убедиться, что трейс возникает именно на Debug Remote server, так же можно попробовать запускать проект не в режиме дебага, а в режиме run, трейс должен отправляться в любом режиме):


import sys

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




А для чего мы это, собственно говоря, делали? А чтобы запускать runserver без --noreload. Чтобы и изменение кода и брейкпоинты обрабатывались "онлайн".
Примерно вот такая картина:

11 комментариев:

  1. Абсурдное название статьи, такое ощущение что автор вообще не понимает зачем плагин PyDev в Eclipse

    Да и инфа наверно первоначально содрана с форрума http://python.su/forum/viewtopic.php?id=5281

    ОтветитьУдалить
  2. 1. Поясните, в чем абсурдность? Вы можете сделать тоже самое не используя Pydev?
    2. Ссылка на форум. Прочитал, в принципе то же (см. ниже), но тема не раскрыта.
    А инфа первоночально http://bear330.wordpress.com/2007/10/30/how-to-debug-django-web-application-with-autoreload/ отсюда, и я этого не скрывал, так как ссылка в статье есть.

    ps. Ну и приветствую ссылки на ваши статьи, хочу почерпнуть знаний в не абсурдных заголовках и знающих текстов.

    ОтветитьУдалить
  3. Не знаю, Анонимный-ли (которого комментарий выше) автор блога "night-fairy-tales.blogspot.com" или нет, но на следующий день на нем появилась статья "Django+Eclipse. Autoreload Django сервера в Debug режиме."

    Ну как бы, тоже самое, только более подробно разжевано. Можно попробовать прочитать статью там, если у Вас что-то не получается.

    ОтветитьУдалить
  4. :))))

    "Можно попробовать прочитать статью там, если у Вас что-то не получается."

    Не пойму только одного, зачем писать о том, что сам первоначально не попробовал?!

    ОтветитьУдалить
  5. Да ты еще отлично изменил статью после прочтения моего поста :)))). Поздравляю, за перепечатывания 5! :)

    Сам хоть пробовал? :)

    ОтветитьУдалить
  6. Я изменил ее до прочтения твоего поста. Изменения символические, вставил пару скринов для ясности происходящего (для таких непонимающих, типа тебя).

    ps. конечно не пробовал, зачем мне оно нужно?

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

    ОтветитьУдалить
  8. Одни тролли в каментах...

    За статью спасибо. Как раз ковыряю отладку в pydev. Хотя, до таких проблем еще даже и не дошел. Просто не могу элементарно отловить эксепшин. Никакого намека вообще на то, что что-то произошло. В Winpdb как-то попроще с этим, в консоли сразу все видно было.

    ОтветитьУдалить
  9. Какой настырный спамер. Мне в блог тоже насрал. Вот бы поймать его за хвост и отбуцать морду лица.

    ОтветитьУдалить
  10. Действительно, первый спамер тут, которого я вижу. Как отладка, работает?

    ОтветитьУдалить
  11. Так и не разобрался с проблемой :) Так что в эклипсе ее не использую пока.

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