В этом кратком практическом руководстве вы узнаете, как отлаживать веб-приложение Tornado/PythonOnWheels с помощью Visual Studio Code (VSCode). На самом деле это очень простая задача. Очень удобно настроить отладку в VSCode, потому что это действительно упрощает процесс разработки. У вас есть вся информация в одном месте. И это также выглядит великолепно ;) Поскольку PythonOnWheels основан на Tornado, это также будет работать для любого другого приложения Tornado.

Тизер: вот что мы получаем в итоге. Действительно приятно и полезно. Все в одном месте.

Почему ?

Это действительно упрощает отладку ваших приложений. Я лично являюсь другом ведения журнала для производственных систем и просто печатаю на стандартный вывод для большей части отладки разработки. Но при настройке отладки в VSCode сразу видны преимущества.

  • Установить точки останова
  • Просмотреть все переменные в текущей области выполнения
  • Шагните в методы или перешагните через них
  • И все в одном представлении.

Предпосылки:

Установите PythonOnWheels и создайте проект. PythonOnWheels — это веб-фреймворк для Python на базе Tornado, основанный на ruby on rails workflow. Установка PythonOnWheels и настройка проекта занимает всего несколько минут и работает на Windows, Linux и Mac. Если вы не знаете, как это сделать, просто прочитайте короткую документацию по началу работы (5 минут).

Предпосылки:

  • создайте новое приложение PythonOnWheels (PoW) с именем debugtest
  • добавить виртуальную среду в папку debugtest/venv.
  • установить требования pow.
  • установить VSCcode (если у вас его еще нет)
  • установите расширение python для VSCode (если у вас его еще нет)

Настройте отладку в VSCode для вашего проекта:

1) Установите интерпретатор Python

В VSCode сначала выберите «правильный» интерпретатор Python для вашего проекта. Это файл из файла virtualenv вашего проекта.

  • Откройте палитру команд (Виды-›Палитра команд).
  • выберите: Python: выберите интерпретатор
  • теперь выберите тот, который указывает на ваш текущий ./venv/. (Это немного отличается в Windows: .\venv\Scripts\python.exe и Linux/OSX, где это: ./venv/bin/python)

2) Настройте настройку отладки

  • Щелкните значок отладки, чтобы открыть представление отладки VSCode (или перейдите к просмотру->отладка)

Прямо рядом со стрелкой «начать отладку» вы можете видеть, что в настоящее время для этого проекта нет конфигурации.

  • Просто щелкните раскрывающийся список рядом с «Нет конфигураций» и:
  • Нажмите «Добавить конфигурацию»

  • Выберите шаблон конфигурации для: Файл Python (это создаст и откроет для нас фиктивный файл launch.json.)

Теперь важная часть: создайте конфигурацию для проекта PythonOnWheels / Tornado.

  • замените содержимое launch.json следующим
{  
    // Use IntelliSense to learn about possible attributes.  
    // Hover to view descriptions of existing attributes.  
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387  
    "version": "0.2.0",  
    "configurations": [  
        {  
            "name": "Python: PoW",  
            "type": "python",  
            "request": "launch",  
            "program": "${workspaceFolder}/server.py",  
            "args": [],  
            "console": "integratedTerminal"  
        }  
    ]  
}
  • Теперь сохраните файл launch.json. Вот как это должно выглядеть сейчас.

Эта конфигурация (названная: «Python PoW») будет просто использовать настроенный вами интерпретатор Python для запуска файла server.py в вашем текущем каталоге проекта (${ папка рабочей области). И этого достаточно для запуска и отладки вашего веб-приложения с помощью vscode. Вы также можете добавить аргументы командной строки в массив args[] или даже добавить переменные среды, добавив массив env[] , но на данный момент нам это не нужно.

Итак, давайте проверим это с помощью сеанса отладки.

  • Вернитесь в проводник VSCode и откройте обработчик hello_world (handlers/hello_world.py).
  • Добавьте точку останова в строке 10, просто щелкнув левой кнопкой мыши перед номером строки. Это добавит красный шар перед линией

  • Вернитесь в режим отладки: (щелкните значок ошибки или перейдите в режим просмотра->отладка). Это откроет «пустое» представление отладки. Держите ваш текущий файл открытым, чтобы вы могли легко увидеть свою точку останова. (Вы также можете увидеть все точки останова вашего проекта в левом нижнем углу окна отладки.)

  • Теперь запустите сеанс отладки, щелкнув зеленый значок воспроизведения рядом с конфигурацией Python PoW. Это запустит сеанс отладки с настройкой, которую мы только что настроили в нашем файле launch.json. Убедитесь, что конфигурация называется: Python PoW

На рисунке ниже вы можете видеть, что это автоматически добавляет терминальное представление (если у вас его еще нет), которое показывает, что приложение PythonOnWheels успешно запущено (в правом нижнем углу). И вы также получаете несколько значков управления в правом верхнем углу VSCode. Чтобы возобновить, войдите, приостановите или остановите отладку.

Давайте нажмем точку останова

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

  • Теперь откройте браузер и перейдите по URL-адресу /hello вашего проекта. Если что-то по умолчанию (как в моем случае), это:
http://localhost:8080/hello

Вот что VSCode показывает нам сейчас:

Вы можете видеть маленькую желтую стрелку вокруг нашей точки останова. Это где приложение прямо сейчас. Он остановил выполнение непосредственно перед выполнением строки 10. Если вы параллельно посмотрите на окно браузера, вы также заметите, что ваш запрос браузера не завершается. Это потому, что мы не выполнили ответ:

self.write("hello world")

Теперь вы также можете увидеть массу полезной информации о переменных, которые в настоящее время доступны для области действия экземпляра HelloHandler. Все это загружается для нас отладчиком. Я думаю, вы согласитесь, что это действительно гораздо полезнее, чем просто несколько отпечатков. Но, кстати, вы также можете увидеть любую информацию об отладке print(), которую вы хотите или уже имеете, в окне терминала ниже.

Так что у нас действительно есть лучшее из обоих миров здесь в одном представлении!

Кроме того, вы также можете увидеть стек вызовов (в левом нижнем углу окна отладки). Который показывает нам поток приложения PythonOnWheels.

http request -> Server -> Base Handler -> Route + Request Type (GET, POST.. ) => actual handler / method call.

В этом конкретном случае:

http request (/hello, GET) -> Server -> Base Handler -> /hello+ Request Type (GET) => HelloHandler.hello_world()

Теперь давайте продолжим приложение и закончим запрос.

Для управления вашим приложением вы можете использовать панель управления в правом верхнем углу. Завершите запрос, щелкнув синий значок «Пауза/Воспроизведение» (или нажмите F5).

Произойдут две вещи:

  • Ваш браузер теперь показывает «привет, мир!» (так что запрос действительно закончен)
  • Представление отладки снова становится пустым, потому что наше приложение снова находится в приложениях IOLoop, ожидая новых запросов.

Далее: протестируйте, поэкспериментируйте

Я действительно рекомендую немного поиграть с этим и проверить всю информацию, доступную вам в представлении переменных. Я просто хочу указать на переменную запроса, которая содержит всю информацию, которую браузер отправляет вместе с запросом и которая доступна вам в приложении. Это отрывок из демо-вызова /hello (Firefox). Много информации о пути, теле запроса, файлах cookie, …..

Это оно

Просто короткое вступление, но я надеюсь, что это будет так же полезно для вас, как и для меня ;). Кстати, этот способ настройки отладки, конечно же, также применим не только для приложений на основе Tornado, таких как PythonOnWheels, но и для многих других проектов Python, которые вы можете использовать. Почти всегда просто определяйте правильный интерпретатор Python и добавляйте базовый launch.json в качестве начала.

Подробнее о PythonOnWheels читайте в документации. Как и при подключении к MongoDB, предоставляйте JSON/REST API для баз данных SQL за несколько минут и более…