Веб-приложение на Lazarus

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Веб-приложение на Lazarus

Сообщение Ichthyander » 01.10.2017 13:12:30

Выложу небольшой краткий отчет о своем опыте создания небольшого fast-cgi приложения на Lazarus в ОС Linux.
Это не руководство по созданию веб-приложения, здесь просто опишу те грабли, на которые натыкался и впечатления - надеюсь, какому-нибудь новичку поможет.
Данный топик по сути сделан в продолжение этим http://freepascal.ru/forum/viewtopic.php?f=25&t=24835&p=123969, http://freepascal.ru/forum/viewtopic.php?f=13&t=24752, http://freepascal.ru/forum/viewtopic.php?f=25&t=11057 и другим. Предварительно скажу, что несмотря на скепсис некоторых форумчан по поводу создания веб-приложения на Lazarus - первыми результатами и удобством разработки я доволен. К тому же я планировал использовать общие модули при создании десктопного приложения и веб-приложения.
Итак, сервер: Debian 8.9 (x86_64). Менеджер для работы с веб-сервером ISPManager 5 Lite.
Среда разработки и компоненты: Lazarus, Brookframework (основной компонент для работы сайта), dopf (для работы с базами данных), JTemplate (шаблонизатор).
Настройка сервера.
Относительно долго промучался на данном этапе, даже попробовал обратиться к специалистам. Как подсказал один хороший человек: Fast-cgi приложение (модуль mod_fcgid) не будет работать с Апач в режиме mpm-itk. В итоге перенастроил: добавил Nginx (необязательно) и апач в режиме mpm-prefork.
В конфигурации Nginx www-домена ISPManager (доступно под root):
Код: Выделить всё
#user 'user1' virtual host 'example.com' configuration file
<VirtualHost 127.0.0.1:8080>
   ServerName example.com
   AddDefaultCharset UTF-8
        ... ... ...
   ScriptAlias / /var/www/user1/data/www/example.com/cgi-bin/index.fcgi/
   ... ... ...
</VirtualHost>
<Directory /var/www/user1/data/www/example.com>
   Options +ExecCGI
</Directory>
... ... ...

В конфигурации строчка с директивой ScriptAlias добавлена вручную. Остальные настройки выполняются настройками интерфейса пользователя и сайта в ISPManager.
Алиас добавлен, чтобы в пути веб-приложения не было папки с cgi-приложениями /cgi-bin/ и имени файла самого веб приложения . В нашем случае это index.fcgi, но может быть любое имя some-name.someext с любым расширением или вообще без него.
Права для запуска index.fcgi выставляются 744, причем если выставить 777 или 766 приложение уже не работает. Важно, чтобы в начале была цифра 7 само собой.
Машина на которой собираю приложение Ubuntu x86_64.
Собственно по настройке все. В сети есть еще материалы (к примеру, https://petrochenko.ru/lazarus/lazarus-cms.html ) по настройке работы fast-cgi, а я постарался осветить то, на чем не было акцента в них.

При разработке самого приложения все прошло как по маслу, думаю в основном благодаря прекрасному фреймворку для разработки веб-приложений https://silvioprog.github.io/brookframework/
Основная идея работы фреймворка вертится вокруг класса TBrookAction. Основной его каркас можно выбрать уже при создании (Создать -> BrookFrameWork -> CGI/Fast CGI Full Application - запустится мастер или Simpl Fastcgi application). При создании в мастере, можно сразу выбрать набор TBrookAction, предварительно продумав url-структуру для веб-приложения. У каждого такого TBrookAction присутствует методы GET, POST, внутри которых пишем обработчик и записываем страницу выдачи с помощью метода Write (не fp метод, а метод класса!). К примеру вот такой простой обработчик:
Код: Выделить всё
procedure TMyBrookAction.Get;
begin
  Write(Hello World!);
end;

Откуда берутся исходные переменные от пользователя? В этом фреймворке все тоже четко продумано и интуитивно понятно.
К примеру GET или POST параметры можно получить из свойств объекта Params (TStringList, name=value параметры). К примеру, получить значение GET параметра var2 из url строки http://example.com/cgi-bin/index.fcgi?var1=34&var2=some-value нужно обратиться к нему вот так Params.Values['var2']; . Но зачастую параметры веб-приложению нужно передавать и через структуру самого url. К примеру,
http://example.com/cgi-bin/index.fcgi/subdir/someparamter1/otherparameter/?var1=34&var2=some-value приложение может получит данные otherparameter с помощью своей системы роутинга (не знаю как правильно назвать). В каждом пользовательском модуле TBrookAction в раздел инициализации добавляется строчка, которая описывает структуру url (таких модулей, структур со своими обработчиками может быть сколько угодно в одном веб-приложении)
Код: Выделить всё
TMyBrookAction.Register('/subdir/:var1/:var2/');

Тогда чтобы получить значение переменной var2 пишем так Values.Values['var2']
Кстати, если в конфигурации Nginx прописать алиас для приложения как в начале поста, то url сократится до http://example.com/subdir/someparamter1/otherparameter/?var1=34&var2=some-value , таким образом уберется ненужная для глаз пользователя часть url пути /cgi-bin/index.fcgi/
В каждом веб-приложения мастер Brookframework создает также заготовку модуль brokers, где прописываются основные настройки веб.
В разделе инициализации этого модуля, к примеру
Код: Выделить всё
initialization
  PublicHTMLDir := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0)));
  BrookSettings.Charset := BROOK_HTTP_CHARSET_UTF_8;
  BrookSettings.Page404File := PublicHTMLDir+'404.html';
  BrookSettings.Page500File := PublicHTMLDir+'500.html';
  BrookSettings.RootUrl := 'http://example.com';

  BrookStaticFileRegisterDirectory('/assets/',
    '/var/www/user1/data/www/example.com/assets');

Обратите внимание на последнюю строчку это нужно, что "маршрутизатор" веб приложения не пытался обработать статические файлы (css, js и т .д.).
Конечно, я кучу других возможностей важных не осветил, есть подробная документация на BrookFramework https://brookframework.org/doc/index.html

Хочу также отметить, что помимо самого компонента BrookFramework я рекомендую воспользоваться дополнительными компонентами, также инкапсулирующие другие возможности для веб-приложений, которыми я и воспользовался
https://github.com/silvioprog/dopf компонент dopf для работы с базами данных. Поддерживаются несколько движков. Я воспользовался SQLite3
https://github.com/leledumbo/QTemplate Шаблонизатор для отделения функционала от дизайна, верстки и прочего.
Также рекомендую подключить RUtils https://github.com/silvioprog/rutils для часто тербуемых функций для веб-приложений.
--- --- --
Из минусов разработки веб-приложения на Lazarus наверное выделю одно - неудобство обновления приложения. Нужно собрать, залить на сервер, выставить права. Иногда (не нашел пока закономерности :) ) требуется перезагрузить службу апач (
Код: Выделить всё
/etc/init.d/apache2 reload
). На начальном этапе разработке, когда часто обновляешь - задерживает. Но, в принципе, можно, наверное, написать какой-нибудь скрипт, автоматизирующий все это.
В остальном одни плюсы, по крайней мере для меня.
Еще раз: наверняка, что-то подзабыл важное для новичков, но что вспомнил - то вспомнил.
Надеюсь, кому-то поможет. Спасибо за внимание. ;)
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 686
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru