5

CGI::Application Web アプリに実行モードがあり、コマンド ラインからトリガーして自動化できるようにしたいと考えています。Web アプリの観点からは、何らかの処理を行い、結果を電子メールで送信します。

Web インターフェイスから呼び出されると、一連のパラメーター (電子メール アドレス、実行するクエリ、日付など) が渡されるため、これらを渡す必要があります。

Web から実行した場合と同じ CGI::Application アプリへの呼び出しを作成するにはどうすればよいですか?

4

6 に答える 6

6

元のCGI 仕様では、コマンド ラインから簡単に実行できます。また、特定の HTTP 専用インターフェイスとしてではなく、FTP と gopher、および新しいトップレベル URL スキームを処理できるものとして完全に意図されていました。それを特定するのを手伝ったとき、私は自分が何を望んでいたかを知っています。

私が参照した仕様は、必要なものをすべて提供するはずですが、ほとんどの場合、環境変数のコレクションにすぎません。次のリクエストが表示された場合:

http://some.server.com/some/path?a=b&c=d

環境変数は次のようになります。

SERVER_PROTOCOL=http
REQUEST_METHOD=GET
HTTP_HOST=some.server.com
SERVER_PORT=80
PATH_INFO=/some/path
QUERY_INFO=a=b&c=d

Perl でその極性を逆にするには、次のようにします。

$ENV{'SERVER_PROTOCOL'} = 'http';
$ENV{'REQUEST_METHOD'} = 'GET';
$ENV{'SERVER_PORT'} = 80;
$ENV{'PATH_INFO'} = '/some/path';
$ENV{'QUERY_INFO'} = 'a=b&c=d';
system("perl your-CGI-script.pl");

POST クエリの処理は少し複雑になり、必要になる可能性のある環境変数が増えます。最悪の場合、次のような簡単な CGI スクリプトでそれらをすべて列挙できます。

print "Content-Type: text/plain\r\n\r\n";
foreach (keys(%ENV))
{
    print "$_=$ENV{$_}\r\n";
}

これを Web サーバーの CGI スクリプトの代わりに配置すると、渡されたすべての環境が表示されます (元の環境も表示されるため、いくつかの判断が必要になります)。

于 2009-07-17T00:41:51.670 に答える
3

CGI::AppCGIのドキュメントをさらに掘り下げると、思ったより簡単に見えました。最も単純なケース (実際の引数の処理や webapp run 呼び出しからの出力の処理はありません) は次のとおりです。

#!/usr/bin/perl

use strict;
use warnings;

use CGI;
use WebApp;

my $cgi = new CGI( \%{@ARGV} );

my $webapp = WebApp->new( QUERY => $cgi );
$webapp->run();

CGI を作成するには、スペースで区切られた一連の名前と値のペアが必要です。実行モードとすべての引数を渡す必要があります。

于 2009-07-17T02:26:49.687 に答える
3

私は CGI::Application のメンテナーであり、これを常に行っています。CGI::Application で構築された多数の cron スクリプトがあります。インフラストラクチャをアプリケーションと共有すると便利だからです。

最も簡単なアプローチは次のとおりです。

# There is no browser to return results to.
$ENV{CGI_APP_RETURN_ONLY} = 1;

my $app = WebApp->new;
$app->direct_run_mode_method;

その例では、通常のフローをバイパスして、メソッドを直接呼び出します。その場合、「セットアップ」または「ティアダウン」アクションを実行する必要がないことを確認してください。

呼び出す実行モードが 1 つだけの場合は、「start_mode」を設定して run() を呼び出すこともできます。これにより、デフォルトの実行モードがデフォルトで呼び出されます。

別のアイデア: Getopt::Long のようなモジュールを使用して、PARAM ハッシュを介して new() に値を渡すか、実行モード選択プロセスを完全に置き換えることができます。コマンド ライン フラグを使用して実行モードを決定する例を次に示します。

sub setup {
    my $self = shift;

    $self->start_mode('send_error_digests');
    $self->run_modes([qw/
        send_error_digests
        help
    /]);

    my ($dry_run, $help);
    GetOptions(
        'dry-run' => \$dry_run,
        'help'    => \$help
    );

    $self->param('dry_run' => $dry_run);

    $self->mode_param(sub {
        return 'help' if $help;
        return $self->start_mode();
    });
}
于 2011-05-04T13:51:06.997 に答える
0

したがって:

$ perl yourscript.pl  field1=value1 field2=value2

PerlのCGIライブラリが魔法の面倒を見てくれます。CGI::ApplicationはCGIに依存しているようです(サンプルコードから判断すると)。

于 2009-07-16T23:42:14.830 に答える
0

何かを成し遂げたいと思うたびにCGI::Applicationを実行する代わりに、おそらくMVCセットアップを使用して、関心の分離を適切に実施します。すべての機能は、CGI :: Applicationのものの外部に存在する必要があります。これは、コントローラーとしてのみ機能する必要があるためです。これらのビットを分離すると、他の入力メソッド用に他のコントローラーを簡単に作成できます。

Webアプリケーションを作成しないでください。たまたまWebインターフェイスを備えたアプリケーションを作成します。それがあれば、アプリケーションに他の種類のインターフェースを簡単に与えることができます。

于 2009-07-16T23:45:24.853 に答える
0

curl、wget、または適切なパラメーターを指定した LWP GET スクリプトを使用して Web アプリを呼び出すことにより、自動化できます。私は、Catalyst アプリケーションで cron 駆動のタスクに同様のシステムを使用しました。

それはあなたのためにすべての環境変数を扱います..

于 2009-07-19T23:36:46.553 に答える