繁体   English   中英

Perl Dancer如何管理表单动作

[英]Perl Dancer how to manage form actions

我正在学习perl Dancer,并根据两个日期(今天和明天)的形式选择工作清单。 如果选择今天,则将生成今天的待办事项列表;如果选择明天,则将创建其他列表。

我创建了一个名为舞蹈家应用: Organizador ,并已在我的下面Organizador.pm

package Organizador;
use Dancer ':syntax';
use DBI;

our $VERSION = '0.1';
set session => "Simple";

get '/' => sub{
template 'index';  
}; 

get '/create_to_do_list'=>sub{
template 'create_to_do_list';
};

我已经创建了一个名为create_to_do_list.pl的文件,该文件包含在创建表单时要执行的脚本。

<form action="create_to_do_list.pl">
<legend>Create todo list</legend>
        <label for="todoList">Create a todo list</label>
            <select name='todoList' id='todoList'>
                <option value="today">today</option>        
                <option value="tomorrow">tomorrow</option>
            </select>
            <button>Cancel</button>
            <button>Create</button>
</form>

如何调用create_to_do_list.pl作为对template 'create_to_do_list'; 点击创建按钮后?

谢谢!

首先,在您走得太远之前,请从Dancer切换到Dancer2。

从您的评论看来, create_to_do_list.pl是一个CGI程序。 它是否在同一台Web服务器上运行? 您可能可以使用LWPHTTP :: Tiny中的某些东西远程调用它,但我认为这不是一个好主意-您将获得HTML,您需要以某种方式进行解析以提取有用的信息。

将代码从create_to_do_list.pl移到模块中是一个更好的主意。 如果CGI程序也需要存在(也许是出于历史原因),则可以将核心代码移到一个模块中,该模块可以从CGI程序和新的Dancer应用程序中使用。 但是,如果Dancer应用程序准备就绪后,您不需要CGI程序,则只需将代码复制到Organizador.pm的正确位置即可。

与直接使用DBI相比,您可能会发现切换到Dancer :: Plugin :: Database (或与之等效Dancer2 )更容易,除了最简单的数据库程序以外,还可以使用其他任何东西,我建议使用DBIx :: Class (和Dancer2 :: Plugin :: DBIC )。

我想搬到Dancer,所以我认为有一种更快的调用脚本的方法,而不必复制它……我正在与成千上万的[CGI]待办事项清单...

理想情况下,您应该将所有CGI脚本转换为模块,以便可以在非CGI上下文中使用它们(例如,单元测试,Dancer和Mojolicious之类的Web框架); 但是,如果您确实有成千上万个,那将花费很长时间。

作为进行转换时的权宜之计 ,您可以使用CGI :: CompileCGI :: Emulate :: PSGI围绕每个未转换的CGI脚本创建PSGI包装器。 您可以使用Plack :: Builder轻松将它们与Dancer2 *应用程序集成。

例如,要将以下CGI脚本与Dancer2应用集成:

use strict;
use warnings 'all';

use CGI;

my $q = CGI->new;
print $q->header,
      $q->start_html,
      $q->h1('Hello, CGI!'),
      $q->end_html;

修改bin/app.psgi如下所示:

use strict;
use warnings 'all';

use FindBin;
use lib "$FindBin::Bin/../lib";

use CGI::Compile;
use CGI::Emulate::PSGI;
use Plack::Builder;

use MyApp;

my $foo_cgi = CGI::Compile->compile('/path/to/foo.cgi');

builder {
    mount '/'    => MyApp->to_app;
    mount '/foo' => CGI::Emulate::PSGI->handler($foo_cgi);
};

现在,对/请求将调用MyApp中的/路由,而对/foo请求将调用您的CGI脚本。

在您的表格中,更改:

<form action="create_to_do_list.pl">

至:

<form action="/foo">

确保表单字段的名称都与CGI脚本所期望的相匹配,瞧! 您可以继续使用CGI脚本而无需进行修改。

(请注意,您可以跳过所有PSGI包装器业务,而仅继续使用Apache或以前使用的任何服务提供CGI脚本,但是这种方法可以使您集中路由并简化部署。)

为要与应用程序集成的每个CGI脚本添加单独的mount语句。 请注意,这种方法可能会出现性能问题 ,因此在将CGI脚本转换为适当的模块时,应仅将其用作临时措施。


*对于新开发,您确实应该使用Dancer2。 Dancer1处于维护模式,尽管仍得到官方支持,但不会获得任何新功能。 我知道您在使用Dancer2入门时遇到了麻烦 ,但是您应该解决这些问题,而不要使用旧版本的框架。 (目前尚不清楚您到底在遇到什么问题;如果仍然需要帮助,则应编辑该问题。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM