gpt4 book ai didi

perl - 如何在 Mojolicious 应用程序中从命令行获取凭据?

转载 作者:行者123 更新时间:2023-12-03 01:33:52 26 4
gpt4 key购买 nike

我正在开发一个 Mojolcious 独立应用程序。在代码中,我正在联系内部后端,用户应在其中提供一些凭据。

目前我正在代码中使用凭据作为变量。它看起来有点像:

$password = 'somthing';

我尝试使用配置插件在那里存储凭据,但是 Mojolicious 是否有一个选项可以让用户在运行守护程序时提供他的凭据?也许像:

perl myapp.pl daemon -user username -password password

Mojolicious 处理此用例的最佳策略是什么?

最佳答案

我将针对这个问题提供两种解决方案。一种相当简单,另一种则使用一些高级技术。

简单:使用环境变量

您只需在启动应用程序时将环境变量传递给应用程序即可。

$ USERNAME=foo PASSWORD=bar perl app.pl daemon

Mojolicious 是 Perl,所以它们最终出现在 %ENV 中。我们可以通过 $ENV{USERNAME} 访问它们和$ENV{PASSWORD} 。通常这些环境变量都是大写的。选择特定于应用程序的内容是有意义的,因此 MYAPP_USERNAME可能比USERNAME更好的选择.

这样做的好处是,您还可以在 shell 环境中设置它,然后您就不必担心它。

package MyApp;
use Mojolicious::Lite;
use Data::Printer;

helper(
credentials => sub {
state $credentials = {
username => $ENV{USERNAME},
password => $ENV{PASSWORD},
}
}
);

get '/' => sub {
my $c = shift;
$c->render( text => np $c->app->credentials );
};

app->start;

在上面的示例中,我创建了一个 helper它为我们保留凭据,以便轻松访问它们。当然你可以只使用$ENV{USERNAME}贯穿整个代码,但我相信正确封装它会更好。

如果我们curl localhost:3000我们得到这个输出的守护进程。

$ curl localhost:3000
\ {
password "bar",
username "foo"
}

高级:子类 daemon命令

命令行参数全部由 Mojolicious::Command 处理.

您可以创建自己的 Mojolicious::Command 子类。这记录在 Mojolicious::Cookbook 中。如果你命名它 Mojolicious::Command::foo那么您甚至不需要担心为 Mojo 添加另一个命名空间来查找命令。

但不幸的是,您不能同时传递多个命令。因此创建一个子类credentials然后这样做不起作用。

$ perl myapp.pl daemon credentials --username foo --password bar

所以我们需要做点别的事情。快速浏览一下Mojolicious::Command::daemon告诉我们它只有 run方法,当调用该命令时会自动调用该方法。我们希望它做一些额外的事情,所以我们对该特定命令进行子类化。

package Mojolicious::Command::mydaemon;
use Mojo::Base 'Mojolicious::Command::daemon';
use Mojo::Util 'getopt';

sub run {
my ( $self, @args ) = @_;

getopt
'u|username=s' => \my $username,
'p|password=s' => \my $password;

$self->app->credentials->{username} = $username;
$self->app->credentials->{password} = $password;

return $self->SUPER::run;
}

我们需要导入getopt ,这可以帮助我们从命令行读取内容。我们将用户名和密码存储在credentials中helper 就像第一种方法一样,因为封装很好。

最后需要交给原run方法。这是通过调用$self->SUPER::run来完成的。 ,这是 Perl 的表达方式 call run在我继承的父类(super class)上。它调用run关于SUPER::伪类。您可以在 perlobj 中了解更多信息。 .

现在实际的应用程序几乎是一样的。

package MyApp;
use Mojolicious::Lite;
use Data::Printer;

helper(
credentials => sub {
state $credentials = { username => q{}, password => q{}, };
}
);

get '/' => sub {
my $c = shift;
$c->render( text => np $c->app->credentials );
};

app->start;

我们这样运行:

$ perl code/scratch.pl mydaemon --username foo --password bar

如果我们curl localhost:3000我们得到相同的输出。

$ curl localhost:3000
\ {
password "bar",
username "foo"
}
<小时/>

您选择哪种方式取决于您。我自己也不确定自己更喜欢哪一个。两者各有优点。

环境变量更容易实现并且更可移植,但代码不太清晰。如果正确完成,命令子类可以记录自身,但也许您的用户不会期望 daemon 之外的其他内容。 。它还需要更多代码。

关于perl - 如何在 Mojolicious 应用程序中从命令行获取凭据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42390960/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com