WEB开发网
开发学院服务器云计算 Perl 和 Amazon 云,第 4 部分:深入探究完整 mod... 阅读

Perl 和 Amazon 云,第 4 部分:深入探究完整 mod_perl 站点的代码库

 2010-02-04 00:00:00 来源:WEB开发网   
核心提示: 我们在这里没有使用 Net::Amazon::S3 模块,但是我们本来可以使用的(我在 第 2 部分 中提到过),Perl 和 Amazon 云,第 4 部分:深入探究完整 mod_perl 站点的代码库(4),为了保持简单,因此在制定架构决策时决定不使用这个模块;在介绍上传时将详细讨论这点,奇

我们在这里没有使用 Net::Amazon::S3 模块,但是我们本来可以使用的(我在 第 2 部分 中提到过)。为了保持简单,因此在制定架构决策时决定不使用这个模块;在介绍上传时将详细讨论这点。

清单 4 展示了 SharePerlHandler.pm 的全局设置。

清单 4. SharePerlHandler.pm 的全局设置

use constant IMAGE_MODE  => 0; 
use constant COMMENT_MODE => 1; 
 
use constant VERBOSE => 1; # can also be done through the environment or some other way 
 
my $template = Template->new( { 
     INCLUDE_PATH => '/home/tzz/templates/share', 
     RECURSION => 1, 
     } 
    ); 
 
my $uuid = Data::UUID->new(); 

您需要使用常量来表示基本 SimpleDB 操作的照片模式和评论模式,因此在此处定义它们。VERBOSE 常量可用任何其他方法代替,以控制服务器的详细记录。记住,对冗详细记录的动态控制越多,它的成本就越高(因为服务器需要每次进行检查)。

接下来,您将获得一个全新的 $templates 对象(将从 /home/tzz/templates/share 加载模板并递归)。最后,您获得一个 UUID 生成器,可以在任意位置使用。

主处理程序

是的,主处理程序非常重要,奇迹将在这里发生。所以,一定要多加注意!(醒来了?很好!)仔细查看清单 5。

清单 5. 更多全局设置

sub handler 
{ 
 my $r = shift @_; 
 my $q = Apache::Request->new($r, 
            POST_MAX => 4096, 
            DISABLE_UPLOADS => 1); 
 
 my $user = (rand 2 > 1) ? 'bob' : 'ted'; 
               # pick a user randomly between bob and ted 
               # (50% chance each) 
 
 handle_photo($q);  
               # always try to delete, add, or edit a URL 
               # if it's passed as a parameter 
 handle_comment($q); 
               # always try to delete, add, or edit a comment 
               # if it's passed as a parameter 
 
 my $uri = $q->uri(); 
 my $tfile = $uri; 
 $tfile =~ s,^/,,;      # remove the starting "/" in the name if it exists 
 $tfile =~ s,/$,,;      # remove the ending "/" in the name if it exists 
 $tfile =~ s,/,_,g;      # "/" in the file name becomes "_" so all the 
               # templates can be in one directory 
 
 $tfile = 'index' unless length $tfile; 
               # make the URI "index" if it's 
               # empty (e.g. someone hit the / URI) 
 
 if ($tfile =~ m/\.html$/) 
 { 
 $tfile =~ s/html$/tmpl/;  # map ANYTHING.html to ANYTHING.tmpl 
 } 
 else 
 { 
 $tfile .= '.tmpl';     # map ANYTHING to ANYTHING.tmpl 
 } 
 
 my $policy = ''; 
 my $signature = ''; 
 
 if ($tfile eq 'upload.tmpl') 
 { 
 $template->process('policy.tmpl', 
         { 
         username => $user, 
         }, 
         \$policy) || croak($template->error()); 
 
 my $key = $ENV{AWS_SECRET_KEY}; 
 $policy = encode_base64($policy); 
 $policy =~ s/\n//g; 
 $signature = encode_base64(hmac_sha1($policy, $key)); 
 $signature =~ s/\n//g; 
 } 
 
 $q->send_http_header('text/html; charset=utf-8'); 
 my $output = ''; 
 
 $template->process($tfile, 
   { 
   request  => $q, 
   username => $user, 
   policy  => $policy, 
   signature => $signature, 
   env    => \%ENV, 
   params  => \%{$q->param()}, 
   fimages  => sub { return list_simpledb(sprintf('SELECT * from `%s`', 
          simpledb_image_domain_name())) }, 
   fcomments => \&get_comments, 
   }, 
   \$output) || croak($template->error()); 
 
 print $output; 
 return OK; 
} 

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:Perl Amazon 部分

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接