几年前,我与舞者合影留念,效果很好。 现在我尝试将其移至Dancer2。但是,它不再起作用,因为我有一些无限循环。
假设我的应用看起来像这样:
package App;
use Dancer2;
# Photobox is my pm file with all the magic
use Photobox;
my $photobox = photobox->new();
get '/photo' => sub {
my $photo;
# Trigger cam and download photo. It returns me the filename of the photo.
$photo = $photobox->takePicture();
# Template photo is to show the photo
template 'photo',
{
'photo_filename' => $photo,
'redirect_uri' => "someURI"
};
}
takePicture()看起来像这样:
sub takePicture {
my $Objekt = shift;
my $return;
my $capture;
$return = `gphoto2 --auto-detect`;
if ($return =~ m/usb:/) {
$capture = `gphoto2 --capture-image-and-download --filename=$photoPath$filename`;
if (!-e $photoPath.$filename) {
return "no-photo-error.png";
}
else {
return $filename;
}
} else {
die "Camera not found: $return";
}
}
当我现在调用/photo
时,它将导致无限循环。浏览器一直是“frefreshing”,我的摄像头正在拍摄另一张照片。但它永远不会重定向到/showphoto
。
当我从bin目录运行perl app.pl
应用程序时,它正在使用Dancer(1)。我如何使用Dancer2并使用plackup app.psgi
我试着将它放入一个前钩子,但它什么都没改变。
更新
我找到了解决此问题的方法。
首先,我稍微重构了我的代码。基本的想法是将拍摄照片和照片操作分成两个不同的路线。这样可以更容易地看到会发生什么。
get '/takesinglephoto' => sub {
my $photo;
$photo = takePicture();
$single_photo=$photo;
redirect '/showsinglephoto';
;
get '/showsinglephoto' => sub {
set 'layout' => 'fotobox-main';
template 'fotobox_fotostrip',
{
'foto_filename' => $single_photo,
'redirect_uri' => "fotostrip",
'timer' => $timer,
'number' => 'blank'
};
};
我将takePicture方法移到了我的Dancer主app.pm。
现在我从日志输出中识别出浏览器没有加载'/ takesinglephoto'页面一次,但是每个secons都会刷新它。我认为原因是,takePicture()
需要一些secons来运行并返回输出。舞者不会等到它结束。每次重新加载时,它再次触发takePicture()
并导致无限循环。
我通过实施一次简单的检查来解决这个问题,只运行一次takePicture()
。
# define avariable set to 1 / true
my $do_stuff_once = 1;
get '/takesinglephoto' => sub {
my $photo;
# check if variable is true
if ($do_stuff_once == 1) {
$photo = takePicture();
$single_photo=$photo;
# set variable to false
$do_stuff_once = 0;
}
redirect '/showsinglephoto';
};
get '/showsinglephoto' => sub {
# set variable back to true
$do_stuff_once = 1;
set 'layout' => 'fotobox-main';
template 'fotobox_fotostrip',
{
'foto_filename' => $single_photo,
'redirect_uri' => "fotostrip",
'timer' => $timer,
'number' => 'blank'
};
};
现在它仍然会刷新/takesinglephoto
,但它不会一次又一次地触发takePicture()
,最后,当方法返回照片文件名时,它会重定向到/showsinglephoto
。
我称之为解决方法。有没有更好的方法来解决这个问题?
BR ·阿尔