IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

级联多个应用

扶凯 2011-08-19 23:11:59 累计浏览 3,605 次
本机暂存

Conditional 的中间件和 URLMap 的应用有共同点:它们都是 PSGI 应用,选择执行应用时要么通过 PSGI 取得 PSGI 的应用或者通过中间件来调度到应用 。这是 PSGI 应用程序和中间件最美的地方,今天的要谈一个其它例子。级联多个应用,级联是非常有用的,如果你有数个应用,需要按一定的顺序运行,这尝试着直到返回正常的响应,这有时也被称为链式设计,在一些 Web 应用中常常用到。象 mod_perl 的处理

级联应用
Plack::App::Cascade 可以让你合成多个应用以一定的顺序来运行,直到出现 non-404 responses 的返回.

use Plack::App::Cascade;
use Plack::App::File;
use Plack::App::URLMap;
 
my @paths = qw(
    /home/www/static
    /virtualhost/example.com/htdocs/static
    /users/miyagawa/public_html/images
);
 
my $app = Plack::App::Cascade->new;
for my $path (@paths) {
    my $file = Plack::App::File->new(root => $path);
    $app->add($file);
}
 
my $map = Plack::App::URLMap->new;
$map->mount("/static" => $app);
$map->to_app;

这个应用映射 /static 使用 URLMap.然后全部的请求会试着从 @paths 这三个目录中使用 App::File 应用来找文件,这可能对你想从多个目录多个目录级联起来取文件非常有用。

级联不同的应用

use CatalystApp;
CatalystApp->setup_engine('PSGI');
my $app1 = sub { CatalystApp->run(@_) };
 
use CGI::Application::PSGI;
use CGIApp;
my $app2 = sub {
    my $app = CGIApp->new({
        QUERY => CGI::PSGI->new($_[0]),
    });
    CGI::Application::PSGI->run($app);
};
 
use Plack::App::Cascade;
Plack::App::Cascade->new(apps => [ $app1, $app2 ])->to_app;

 这会建二个应用,一个 Catalyst 和一个 CGI::Application 的。然后按顺序运行这二个应用。假设在你的 URL 的结构中有一个 /what/ever.cat 是通过 Catalyst 的应用来服务和 /what/ever.cgiapp 是使用 CGI::Application 的 app.
这个是不是听起来非常疯狂,我想这是最好使用 URLMap 来映射两个不同的路径给应用,但如果你真的想级联,可能这是一个解决方法:)

这是我的译文,原文地址:http://advent.plackperl.org/2009/12/day-19-cascade-multiple-applications.html

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 2012年数据库技术大会 百度和淘宝介绍的中间件对比 (累计阅读 3,997)
  2. 通过中间件来实现应用的认证 (累计阅读 2,599)
  3. 应用中的静态文件 (累计阅读 2,539)
  4. 根据条件来加载中间件 (累计阅读 2,451)
  5. 使用 plackup (累计阅读 2,267)
  6. Plack 代码和结构分析一[译] (累计阅读 1,951)
  7. 使用 plackup 重新加载应用 (累计阅读 1,924)
  8. Plack 代码和结构分析-PSGI Application Architecture[译] (累计阅读 1,601)
  9. Plack 代码和结构分析-plackup Architecture[译] (累计阅读 1,549)