perl - Mojolicious `under` 是如何工作的?
问题描述
从文档:
仅当回调返回 true 值时,才会评估所有后续路由。
是什么following
意思?
- 仅在此路线下的一组路线
- 稍后在代码中声明的路由,在此之后
under
我也不明白下一个场景会发生什么:
perl -Mojo -E '
app->routes->under("/", sub{ warn "R1"; return undef })->get("/r1" => {text => "r1" });
app->routes->under("/", sub{ warn "R2"; return undef })->get("/r2" => {text => "r2" });
app->start;
'
get /r2
这里没有任何匹配,所以我应该404
像在下一个应用程序中一样:
perl -Mojo -E 'app->start;' get /r2
解决方案
你的假设这里没有匹配是不正确的。你有一条路线/r2
。与该路由关联的回调形成一个链,其中每个回调可以通过返回 true 来呈现响应或将责任传递给链中的下一个回调。
如果您从启用了日志记录的应用程序运行该代码(log/development.log
默认为日志文件),您将看到
[timestamp] [6389] [debug] [Ere90x2U] Nothing has been rendered, expecting delayed response
表示您的回调没有呈现任何内容。
通常,您的under
回调将用于排除一些常见行为,例如检查访问权限(请参阅教程)。
在此示例中,如果需要,回调将重定向到登录页面,或者返回 true 以将控制权传递给链中的下一个回调:
my $logged_in = $r->under(sub ($c) {
return 1 if $c->session('user');
$c->redirect_to('index');
return undef;
});
$logged_in->get('/protected');
实际上,这里的回调是隐式的,并且会渲染/protected
相应的模板。protected.html.ep
推荐阅读
- javascript - 如何处理 HTML/AJAX/DJANGO 中具有相同 ID 的多个元素?
- python - 如何解释 conda 包冲突?
- openlayers - 如何在 Open Layers 中显示矢量的多个特征?
- python - Python 在不同的对象中使用相同的 selenium 驱动程序实例
- javascript - 如何在 Squarespace 上隐藏 API 密钥?
- html - 将数组传递给路由 NodeJS Express
- javascript - 使用 MomentZone 代替 Moment 时区
- ubuntu - 如何使用 wget 下载指定文件的位置?
- python - 将 Pytorch ImageFolder 数据集与自定义 Pytorch 数据集相结合
- sql - 如何分组并选择相应的行值?