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