Perl CGI с использованием HTML::Template

Я хотел бы использовать модуль HTML::Template, но почему-то не могу его настроить работать должным образом. Вот очень простой репрезентативный код, который я тестирую:

use strict;
use warnings;

use CGI;
use HTML::Template;

my $test = new CGI;
my $tmpl = HTML::Template->new(filename => 'TemplateSimple.html');

$tmpl->param(
    title => 'Test',
    body  => '<p>This is a test</p>',
);

my $out = $test->header(
    -type    => 'text/html',
    -charset => 'utf-8'
);


print $out;
print $tmpl->output;

При вызове страницы я всегда получаю в браузере сообщение об ошибке сервера:

502 — веб-сервер получил неверный ответ, выступая в качестве шлюза или прокси-сервера.

TemplateSimple.html

<!DOCTYPE html>
<html lang="de">
    <head>
        <meta charset="utf-8">
        <title><TMPL_VAR NAME=title></title>
        <link rel="SHORTCUT" ICON href="favicon.ico" />
    </head>

    <body>
        <TMPL_VAR NAME=body>
    </body>
</html>

Я должен использовать CGI, потому что я хочу обрабатывать пользовательский ввод на веб-странице, но я хотел бы определить базовую структуру HTML в шаблоне, куда я могу вставлять сегменты кода по мере необходимости.

Редактировать

Я думаю, что это может иметь какое-то отношение к разным конфигурациям между локальным Perl (запускается из eclipse, который работает нормально) и конфигурацией Perl CGI. Кто-нибудь знает о таком случае?

Редактировать

После настройки конфигурации Perl CGI в Eclipse сценарий запускается, как и ожидалось, на локальном хосте. Однако проблема при вызове страницы из внешнего источника сохраняется. Итак, как предположил DaveCross, ошибка кроется в конфигурации веб-сервера, а не в скрипте Perl.


person N. Maks    schedule 22.03.2017    source источник
comment
Что записывается в журнал ошибок веб-сервера? Что вы увидите, если скомпилируете программу из командной строки (с perl -c)? HTML::Template установлен? На дворе 2017 год, почему так много людей до сих пор пишут CGI-программы? :-(   -  person Dave Cross    schedule 22.03.2017
comment
Хе-хе, жаль, что компания, в которой я работаю, все еще использует его... Я бы тоже предпочел что-то более современное. Я не знаю, где находится журнал ошибок сервера, но когда я запускаю perl-скрипт в eclipse, я получаю следующий вывод консоли: Content-Type: text/html; charset=utf-8 HTML::Template=HASH(0x5a2f74). Когда я использую print $tmpl->output, вывод консоли выглядит так, как хотелось бы, но в браузере я все еще получаю сообщение об ошибке.   -  person N. Maks    schedule 22.03.2017
comment
@DaveCross, потому что никто не пишет полноценного полнофункционального руководства по развертыванию материалов PSGI. Слышал, у тебя модный блог... хочешь ТУИТ? :)   -  person simbabque    schedule 22.03.2017
comment
@N.Maks - Ваш код работает (ну, по модулю требуется вызов ->output, но вы уже это заметили). Таким образом, проблема заключается в том, как ваша программа взаимодействует с вашим веб-сервером. И вы ничего не сказали нам о том, как это настраивается. Сказать, что я не знаю, где находится журнал ошибок сервера, не очень полезно. Вы не можете заниматься серьезной веб-разработкой без доступа к журналу ошибок. Уверен, там найдутся полезные подсказки.   -  person Dave Cross    schedule 22.03.2017
comment
хорошо, спасибо за подсказку. Это отправная точка, чтобы знать, что это не код, который вызывает проблемы. Я попытаю счастья с конфигурацией сервера и посмотрю, смогу ли я найти что-то, что поможет.   -  person N. Maks    schedule 22.03.2017
comment
@N.Maks Если вы справитесь с этим, вернитесь и напишите ответ - это поможет другим людям с той же проблемой.   -  person Dave Cross    schedule 22.03.2017
comment
Конечно, если я смогу это решить, я дам ответ   -  person N. Maks    schedule 22.03.2017
comment
В порядке. Итак, глядя на ваши правки к вопросу, я вижу, что мы все согласны с тем, что проблема заключается в интерфейсе между веб-сервером и вашей программой CGI. Так что теперь мы могли бы быть больше помочь, если бы вы дали нам больше информации о том, как это настроено. Какую платформу вы используете? Что за веб-сервер? Работают ли другие программы CGI в этой среде. И, рискуя повториться, вы уже нашли журнал ошибок? Что в нем есть?   -  person Dave Cross    schedule 22.03.2017
comment
@DaveCross: я полностью согласен с simbabque. Практически нет объяснения того, что такое PSGI на самом деле. Что я знаю, так это то, что он специфичен для Perl, в то время как Common Gateway Interface является общим для многих языков, и мой опыт недостаточно обширен, чтобы знать, сделали ли другие языки что-то свое. Аналогичным образом. Компьютерная графика хорошо известна, распространена и имеет наследие. PSGI практически не документирован и прячется за Perl, это сделает все, что вам нужно, и полагается на то, что это новая вещь, чтобы начать работу. Можете подсказать, почему PSGI лучше?   -  person Borodin    schedule 29.05.2018
comment
@Dave: Страница PSGI в Википедии — это город-призрак. То же самое с Plack и Plackup, где я читал, что и у Ruby, и у Python есть свои варианты. Мне это кажется огромным шагом назад. Может, стоит уточнить?   -  person Borodin    schedule 29.05.2018
comment
@Borodin: Я согласен, что мы не очень хорошо объяснили, почему именно PSGI является лучшим решением, чем CGI. Я начал пару проектов, чтобы решить эту проблему, но они застопорились, прежде чем что-то получить. Возможно, я найду время, чтобы вернуться к одному из них. Но я суммирую основные три преимущества в комментариях ниже.   -  person Dave Cross    schedule 29.05.2018
comment
1/ PSGI отделяет ваш код от среды его развертывания. CGI по своей сути является медленной технологией. Чтобы повысить производительность, вам нужно использовать mod_perl или FCGI. И то, и другое потребует серьезных изменений в вашем коде. Если вы пишете PSGI-приложение, вы можете развернуть его как программу CGI, под mod_perl или FCGI или даже как автономную службу за прокси-сервером. И вам вообще не нужно будет менять код.   -  person Dave Cross    schedule 29.05.2018
comment
2/ Приложение PSGI имеет простой интерфейс. Это подпрограмма с определенными входами и выходами. Эта простота упрощает написание мощных средств отладки и тестирования.   -  person Dave Cross    schedule 29.05.2018
comment
3/ Простой интерфейс также открывает дверь в мощную экосистему промежуточного программного обеспечения. Например, вы можете сократить запросы к статическим файлам и отправить их непосредственно в файловую систему, а не запускать большую часть своего приложения. Я знаю, что вы можете сделать это с помощью конфигурации Apache или nginx, но я считаю полезным иметь эти правила в кодовой базе приложения.   -  person Dave Cross    schedule 29.05.2018


Ответы (1)


При инициализации объекта HTML::Template в скрипте Perl

my $tmpl = HTML::Template->new(filename => 'TemplateSimple.html');

Мне пришлось указать полный путь, а не только имя файла, поэтому

my $tmpl = HTML::Template->new(filename => 'C:/inetpub/wwwroot/Project/TemplateSimple.html');

Это решило мою проблему.

Кому это может быть интересно, веб-сервис был настроен с помощью IIS 7 самым простым и стандартным способом.

person N. Maks    schedule 27.03.2017