Я сделал фотобудку с Dancer несколько лет назад, и она работала нормально.Теперь я пытаюсь переместить это в 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
, это приведет к бесконечному циклу.Браузер постоянно обновляется, и моя камера снимает одну фотографию за другой.Но он никогда не перенаправляется на /showphoto
.
. Он работал с Dancer (1), когда я запускал приложение просто на perl app.pl
из каталога bin.Как я использую 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.
Теперь из вывода журнала я узнал, что браузерне загружает страницу '/ takeinglephoto' один раз, но обновляет ее каждые несколько секунд.Я думаю, причина в том, что takePicture()
требуется несколько секунд, чтобы запустить и вернуть результат.И Танцор не ждет, пока это не кончится.С каждой перезагрузкой он снова запускает 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 Arne