Должен ли я перейти с CGI :: Fast на что-то другое в свете устаревшего статуса CGI.pm и как мне это сделать? - PullRequest
0 голосов
/ 16 ноября 2018

Я использую CGI::Fast, чтобы использовать скорость и масштабируемость FastCGI, а также анализ строки запроса CGI.pm.Я не использую устаревшие функции записи HTML в CGI.pm.

В сообществе настоятельно рекомендуется прекратить использование CGI.pm , но в моем случае я должен подумать оуезжаете?И если да, то как мне

1) по-прежнему использовать FastCGI

2) захватить параметры запроса

... без использования такой инфраструктуры, как Dancer или Mojolicious?

Код, который я смотрю на замену, просто:

 while ( $main::cgi = new CGI::Fast ) {
      my $name = $main::cgi->param('name');
 }

Я готов использовать что-то вроде CGI::PSGI в сочетании с Plack::Request, но я не мог понять, какУточните функциональность FastCGI, так как CGI::Fast и CGI::PSGI оба хотят создать подкласс CGI для создания объекта.И я бы все еще имел CGI.pm в миксе, чтобы включить CGI::Fast.Кажется, Плеку нужно многому научиться, чтобы заменить то, что сейчас составляет несколько строк кода.

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Это наглядно иллюстрирует одну из причин, почему PSGI является улучшением CGI (и связанных с ним технологий, таких как FastCGI).В программах в стиле CGI код тесно связан с методом развертывания, и при изменении метода развертывания обычно требуется внести в код довольно большие изменения.С программами в стиле PSGI код один и тот же, независимо от того, как вы его внедрили.

Вы не показали нам ни одного своего кода, но говорите о «нескольких строках кода».Так что вот подход, который я бы выбрал.

  1. Извлеките весь специфичный для FastCGI код из вашей программы, оставив программу в чистом CGI-стиле.
  2. У вас есть выбор.Вы можете использовать методы, которые я описал в Easy PSGI , чтобы преобразовать вашу программу в чистую программу PSGI.Или, если это будет слишком много, используйте CGI :: PSGI для запуска вашей CGI-программы в среде PSGI.
  3. Теперь у вас есть программа PSGI, которую вы можете использовать в довольномного любой среды веб-сервера.Вы можете служить в качестве программы CGI.Вы можете использовать Plack :: Handler :: FCGI , чтобы запустить его под FCGI.Или вы можете развернуть его как автономную службу за веб-прокси (последний вариант - тот, который я выберу).

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

ps CGI.pm точно не рекомендуется.Он был удален из стандартного дистрибутива Perl, но это потому, что его использование не рекомендуется.

0 голосов
/ 16 ноября 2018

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

Простой CGI

Начнем с простой программы CGI. Я буду использовать cgi_this, чтобы запустить его из-за отсутствия реального веб-сервера.

#!/usr/bin/env perl
use strict;
use warnings;
use CGI;

my $q    = CGI->new;
my $name = $q->param('name');

print $q->header;
if ($name) {
  print <<"HTML";
<html><body><h1>Hello, $name</hi></body></html>
HTML
}
else {
  print <<"HTML";
<html><body><form method="GET">
    <label>What's your name? <input type="text" name="name"></label>
</form></body></html>
HTML
}

1;

Это hello.pl . Нужен исполняемый флаг.

Запуск программы

Вы начинаете с cgi_this следующим образом.

$ ls
hello.pl
$ cgi_this
Exporting '.', available at:
   http://127.0.0.1:3000/

Found the following scripts:
    http://127.0.0.1:3000/hello.pl

Теперь вы можете открыть его в браузере.

Firefox with CGI program and form

Если вы введете имя и отправите форму, появится приветствие.

Firefox with CGI program and greeting

Преобразование в PSGI

Все это просто. Теперь давайте преобразуем его.

Начнем с нового файла с именем hello.psgi . На самом деле не имеет значения, если он называется .psgi , но это соглашение.

Мы должны сделать пару шагов, чтобы заставить его работать с протоколом PSGI. Мы будем использовать Plack :: Request , чтобы помочь нам сделать это.

Вся программа должна быть заключена в вызов my $app = sub { ... };.

#!/usr/bin/env plackup
use strict;
use warnings;

use Plack::Request;

my $app = sub {
  my $env = shift;    # this is the Plack environment

  my $req = Plack::Request->new($env);

  my $q    = CGI->new;
  my $name = $q->param('name');

  print $q->header;
  if ($name) {
    print <<"HTML";
<html><body><h1>Hello, $name</hi></body></html>
HTML
  }
  else {
    print <<"HTML";
<html><body><form method="GET">
    <label>What's your name? <input type="text" name="name"></label>
</form></body></html>
HTML
  }
};

# no 1; here, we want it to return $app;

Теперь, очевидно, мы не загрузили CGI, и в любом случае нет среды CGI. Итак, затем нам нужно получить параметр. Избавьтесь от бита $q и используйте вместо него $req.

my $name = $req->parameters->{name};

Теперь запустите это с plackup, затем запросите его на http://localhost:5000.

$ plackup hello.psgi
HTTP::Server::PSGI: Accepting connections at http://0:5000/
<html><body><form method="GET">
    <label>What's your name? <input type="text" name="name"></label>
</form></body></html>
Response should be array ref or code ref: 1 at ...

BANG! Это не удается, потому что мы еще не закончили. Как видите, он записал HTML-код в STDOUT, но это не пошло в браузер. Это потому, что PSGI передает ссылки, а ваша программа не общается напрямую с STDOUT или STDERR.

Он также жалуется на отсутствующую ссылку. Давайте разберемся с этим в первую очередь. В конце ссылки на код добавьте это:

# prepare the response
my $res = $req->new_response(200);
$res->content_type('text/html');

return $res->finalize;

Мы просим наш Plack :: Request создать для нас новый Plack :: Response, установить тип контента и вернуть завершенный (думаю immutable ) ответ обработчику Plack, который будет сериализовать и отправлять в браузер как фактический ответ HTTP.

Теперь замените все операторы print. Создайте новую переменную $content и вместо print ing output соедините ее с этой переменной. Затем передайте это ответу.

  my $content;
  if ($name) {
    $content .= <<"HTML";
<html><body><h1>Hello, $name</hi></body></html>
HTML
  }
  else {
    $content .= <<"HTML";
<html><body><form method="GET">
    <label>What's your name? <input type="text" name="name"></label>
</form></body></html>
HTML
  }

  # prepare the response
  my $res = $req->new_response(200);
  $res->content_type('text/html');
  $res->body($content);

Теперь перезапустите ваше приложение в терминале и снова получите к нему доступ. Это будет выглядеть так же, как CGI.

PSGI version output

0 голосов
/ 16 ноября 2018

PSGI , на что ссылается CGI :: Альтернативы , это путь.

Dancer использует PSGI, но вы можете писать код, используя его непосредственно без рамки, обернутой вокруг него.

Вы можете использовать Plack :: Handler :: FCGI для запуска приложения PSGI через FastCGI.

...