Perl CGI проблема - PullRequest
       15

Perl CGI проблема

3 голосов
/ 15 июня 2011

Я занимаюсь разработкой, которая использует встроенный Linux для ОС и Boa для веб-сервера. У меня есть веб-страница, которая публикует сценарий CGI, обрабатывает данные формы и отвечает. Моя среда разработки была Ubuntu, и все работало нормально, но когда я перенес свой код на встроенный Linux, модуль CGI не был создан (или, по крайней мере, не был создан). Вот урезанный раздел моего кода. Оператор print жалуется на неинициализированную переменную.

use CGI;

use strict;
use warnings;

my $cgiObj = CGI->new();

print $cgiObj->param('wlanPort');

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

У меня такое ощущение, что это проблема конфигурации Боа, и это то, что я буду рассматривать дальше. Я довольно новичок в Perl, поэтому я не уверен, что еще делать. Есть идеи?

РЕДАКТИРОВАТЬ: Определенно не проблема конфигурации Боа. Все еще смотрю на это.

UPDATE: Я упростил свой код до следующего:

#!/usr/bin/perl
use CGI qw(:standard);
$data = param('wlanPort') || '<i>(No Input)</i>';
print header;                            
print <<END; 
<title>Echoing user input</title>
<p>wlanPort: $data</p>           
END  

Как и ожидалось, он печатает (без ввода)

Я должен также указать, что форма имеет вид enctype = "multipart / form-data", потому что у меня должна быть возможность загрузки файла, и я использую метод "POST".

Я использовал плагин HttpFox для проверки почтовых данных и проверил значение wlanPort:

----------------------------- 132407047814270795471206851178 Content-Disposition: form-data; Name = "wlanPort"

eth1

Так что это почти наверняка отправляется ...

ОБНОВЛЕНИЕ 2: Я установил ту же версию Perl и Boa, которая используется во встроенной системе, на моем ноутбуке Ubuntu. Работает на ноутбуке, а не на устройстве, что является тем же результатом. Я сказал своему работодателю, что исчерпал все возможности, кроме того, как Boa и (Micro) Perl построены на устройстве по сравнению с Ubuntu.

Ответы [ 2 ]

1 голос
/ 01 августа 2018

Я знаю, что это очень старый пост, и OP может не интересоваться какой-либо новой информацией, связанной с этим, но общий вопрос о том, как отлаживать CGI-скрипты, все еще имеет некоторое значение.У меня были похожие проблемы со средами разработки и разработки.Чтобы помочь тем, кто наткнулся на эту ветку, я публикую свой опыт работы с этой ситуацией.Мой простой ответ - использовать модули Log :: Log4perl и Data :: Dumper для демистификации этого (при условии, что есть способ доступа к журналам в вашей среде prod).Таким образом, с незначительными накладными расходами, вы можете включить трассировку при возникновении проблем (даже если код работал раньше, но из-за изменений со временем он начал давать сбой).Регистрируйте каждый соответствующий бит информации на соответствующем уровне журнала (трассировка, отладка, информация, предупреждение, ошибка, фатальный) и настройте, какой уровень подходит для операций.Без этих механизмов будет очень трудно понять производственные операции.Надеюсь, это поможет.

use CGI;
use Log::Log4perl qw(easy);
use Data::Dumper;

use strict;
use warnings;

my $cgiObj = CGI->new();

my $log = Log::Log4perl::get_logger();
$log->trace("CGI Data: " . Dumper($cgiObj));

print $cgiObj->param('wlanPort');
1 голос
/ 19 августа 2011

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

Если ваша форма отправляется через POST, то содержимое этой формыбудет отображаться в виде строки с URL-кодом в содержимом HTTP-запроса, получаемого вашим сценарием.Если вы вообще не используете модуль CGI, вы сможете прочитать запрос от STDIN:

my $request = "";
while (<STDIN>) {
   $request .= $_;
}

if (open my $out, ">>/tmp/myapp.log") {
    print $out $request;
    close $out;   
}

Затем вы можете просмотреть файл /tmp/myapp.log и узнать, получаете ли вы всю информацию изпросьба, что вы думаете, что вы есть.

Для полноты, если ваша форма отправляется через GET, аргументы будут в переменной среды QUERY_STRING, которую вы можете посмотреть в Perl с помощью $ ENV {'QUERY_STRING'}.

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

Распространенная проблема заключается в том, что вы назвали параметр формы одной вещью и ищете другое имя параметра в сценарии CGI.Это всегда смех.

Удачи и надеюсь, что это поможет некоторым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...