Perl Catalyst-如何跳过渲染视图

Perl Catalyst-如何跳过渲染视图,perl,catalyst,Perl,Catalyst,在我的一个控制器中,我正在做一些SSE异步流(请参阅),我在一个裸体测试项目中工作得非常好。在测试项目中,我没有一个默认的视图集,所以它似乎只是通过-完美 现在我正试图把它放到我现有的更大的项目中,但是,我发现将它转发到任何视图都会把它搞砸,我不知道如何简单地跳过视图的渲染。因为我现在有一个默认视图,它拒绝仅仅通过 我盲目地尝试了一些方法:$c->detach,$c->forward(undef),覆盖了“end”方法。没有人成功跳过视图渲染-它总是将其传递到我的默认视图 有什么想法吗 编辑 不

在我的一个控制器中,我正在做一些SSE异步流(请参阅),我在一个裸体测试项目中工作得非常好。在测试项目中,我没有一个默认的视图集,所以它似乎只是通过-完美

现在我正试图把它放到我现有的更大的项目中,但是,我发现将它转发到任何视图都会把它搞砸,我不知道如何简单地跳过视图的渲染。因为我现在有一个默认视图,它拒绝仅仅通过

我盲目地尝试了一些方法:
$c->detach
$c->forward(undef)
,覆盖了“end”方法。没有人成功跳过视图渲染-它总是将其传递到我的默认视图

有什么想法吗

编辑

不太相关,但相关行动:

sub time_server : Path('/events') {
    my ( $self, $c ) = @_;
    $c->res->content_type('text/event-stream');
    $timer_model->( $c, $c->response->write_fh );
}

Catalyst::Action::Renderview
在决定是否调用视图时使用了一小部分标准。如果出现以下情况,它将跳过运行视图:

  • 请求是一个
    HEAD
    请求
  • 有些东西已经将
    $c->response->body
    设置为定义的值
  • $c->response->status
    设置为204(“无内容”)或任何3xx(重定向)
  • $c->error
    包含一个或多个错误,并且
    $c->stash->{template}
    尚未设置(因此
    finalize\u error
    可以执行其工作)

老实说,这不是最好的安排,但我会在你的情况下尝试设置
$c->res->body(“”)time\u服务器中的code>操作。空的主体不会写入任何内容,并且您的标题已经完成,因为您已经调用了
write\u fh
,但是仍然定义了一个空字符串,因此它将阻止RenderView执行任何操作。

Catalyst::Action::RenderView
在决定是否调用视图时使用了一小部分标准。如果出现以下情况,它将跳过运行视图:

  • 请求是一个
    HEAD
    请求
  • 有些东西已经将
    $c->response->body
    设置为定义的值
  • $c->response->status
    设置为204(“无内容”)或任何3xx(重定向)
  • $c->error
    包含一个或多个错误,并且
    $c->stash->{template}
    尚未设置(因此
    finalize\u error
    可以执行其工作)

老实说,这不是最好的安排,但我会在你的情况下尝试设置
$c->res->body(“”)time\u服务器中的code>操作。空的主体不会写入任何内容,并且由于调用了
write\u fh
,您的标题已经完成,但是仍然定义了一个空字符串,因此它将阻止RenderView执行任何操作。

这是我强制使用默认Catalyst controller响应JSON类型的函数的解决方案。您应该将内容类型更改为流。 我希望它能帮助你

sub my_function{
    my ( $self, $c ) = @_;
    
    my $payload = {
        "yourkey" => "backtooldschool",
        "yourkey2" => "2020"
    };
    my $result = encode_json($payload);

    $c->response->body($result);
    $c->response->content_type('application/json');
    $c->response->status(200);
}

这是我的解决方案,用于强制使用默认Catalyst controller响应JSON类型的函数。您应该将内容类型更改为流。 我希望它能帮助你

sub my_function{
    my ( $self, $c ) = @_;
    
    my $payload = {
        "yourkey" => "backtooldschool",
        "yourkey2" => "2020"
    };
    my $result = encode_json($payload);

    $c->response->body($result);
    $c->response->content_type('application/json');
    $c->response->status(200);
}

您是使用
Catalyst::Action::RenderView
来调用视图还是其他方式?我只是设置了“default\u view”配置选项,它会自动传递到该视图
default\u view
只会影响
$c->view()的默认返回值。它不会导致任何东西被调用。通常情况下,视图将通过
$c->forward($c->view)
运行,或者通过将
end
操作赋予
RenderView
action类(它做同样的事情)。嗯,我没有自定义的end操作-我只是扩展了
Catalyst::Controller
,所以它必须调用
$c->forward($c->view)
某个地方?您是否使用
Catalyst::Action::RenderView
调用视图或其他方式?我只是设置了“default\u view”配置选项,它会自动传递到该视图
default\u view
唯一的作用是影响
$c->view()
的默认返回值。它不会导致任何东西被调用。通常情况下,视图将通过
$c->forward($c->view)
运行,或者通过将
end
操作赋予
RenderView
操作类(其作用与此完全相同)。嗯,我没有自定义的end操作-我只是扩展了
Catalyst::Controller
,所以它必须在某个地方调用
$c->forward($c->view)