Perl Dancer2 бесконечный цикл при получении при вызове метода - PullRequest
0 голосов
/ 14 мая 2018

Я сделал фотобудку с 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

...