Skip to content

Home Администрирование Создание приложения для просмотра файла журнала веб-сервера Apache с помощью curses
Создание приложения для просмотра файла журнала веб-сервера Apache с помощью curses

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

В примере 11.3 приводится еще одна версия программы просмотра файла журнала веб-сервера Apache, реализованная с использованием модуля curses, входящего в состав стандартной библиотеки языка Python.

Пример 11.3. Приложение curses для просмотра файла журнала веб-сервера Apache

В примере 11.3 мы создали единственный класс, CursesLogViewer, с целью организации программного кода. В конструкторе создается экран curses и инициализируется несколько переменных. Экземпляр класса CursesLogViewer создается в разделе «main» программы, при этом ему передается имя файла журнала, который требуется просмотреть. Мы могли бы реализовать в приложении возможность поиска и выбора файла, но для этого пришлось бы приложить больше усилий, чем в приложении PyGTK. Кроме того, поскольку приложение будет запускаться пользователем из командной оболочки, вполне естественным будет ожидать, что пользователь сначала отыщет требуемый файл в командной строке, а затем укажет его при запуске приложения. После создания экземпляра класса CursesLogViewer мы передаем метод main_loop() функции wrapper() из библиотеки curses. Функция wrapper() переводит терминал в состояние, пригодное для работы приложения на базе curses, вызывает указанную ей функцию, а затем, перед возвратом, возвращает терминал в нормальное состояние.

Метод main_loop() действует как элементарный цикл обработки событий. Он ожидает, пока пользователь нажмет какую-либо клавишу на клавиатуре. После этого в соответствии с введенным символом цикл переходит к соответствующему методу (или, по крайней мере, к реализации требуемого поведения). Нажатие клавиш u и d вызывает прокрутку вверх и вниз - за счет вызова методов page_up() и page_down(), соответственно. Метод page_down() просто вызывает метод draw_loglines(), который выводит строки на терминал, начиная с текущей строки и с верхней позиции на экране. При выводе каждой строки текущей становится следующая строка. Метод draw_loglines() выводит столько строк, сколько поместится на экране, а при следующем вызове он вновь начнет вывод очередной текущей строки с верхней позиции на экране. Поэтому многократный вызов draw_loglines() создает визуальный эффект прокрутки вниз по содержимому файла журнала. Метод page_up() сначала назначает текущей строку, расположенную на две страницы выше, и затем производит вывод строк вызовом метода draw_loglines(). Это создает визуальный эффект прокрутки вверх по содержимому файла журнала. Причина, по которой в методе page_up() текущей назначается строка, расположенная на две страницы выше, состоит в том, что после вывода строк текущей становится строка, расположенная внизу экрана. Такой порядок был выбран для упреждения прокрутки вниз.

Следующий метод нашего класса реализует сортировку. Мы предусмотрели сортировку по имени хоста, коду состояния и количеству байтов, отправленных в ответ на запрос. Любая попытка сортировки приводит к вызову метода sortby(). Метод sortby() сортирует список строк объекта CursesLogViewer по указанному полю, после чего вызывает метод top(). Метод top() назначает текущей первую строку в списке и затем выводит очередную страницу строк (которая будет первой страницей).

Последний обработчик события в нашем приложении выполняет завершение работы приложения. В этом случае просто происходит прерывание «цикла обработки событий», что позволяет методу main_loop() вернуть управление функции wrapper(), которая в свою очередь производит восстановление режима работы терминала.

Несмотря на то, что по числу строк программного кода обе версии приложения вполне сопоставимы, тем не менее, для реализации приложения на базе библиотеки curses пришлось приложить больше усилий. Возможно, это обусловлено необходимостью создавать свой собственный цикл обработки событий. Или, может быть, из-за необходимости создавать некоторое подобие графических элементов. Или, возможно, из-за того, что пришлось «рисовать» текст непосредственно на экране терминала, у нас сложилось ощущение, что пришлось выполнить больше работы. Как бы то ни было, иногда знание того, как создавать приложения на базе curses, может оказаться полезным.

На рис. 11.3 показан внешний вид приложения просмотра файла журнала, в котором строки отсортированы по количеству отправленных байтов.

Одно из улучшений, которое можно было бы внести в это приложение, -это реализовать сортировку в порядке, обратном текущему. Сделать это достаточно просто, но мы оставим реализацию этой возможности читателям. Как еще одно улучшение можно было бы организовать просмотр всей информационной части строки журнала. Это тоже не очень сложно, но реализацию этой возможности мы также оставим за читателями в качестве упражнения.

Рис. 11.3. Содержимое файла журнала веб-сервера Apache

Комментарии (0)

RSS feed Comments

Написать комментарий

smaller | bigger

busy
 

Регистрация




Top