2011-09-07 16 views
5

के साथ एकाधिक ऐप निर्देशिकाएं नर्तक में एक ऐप रखने के लिए एक तरीका है लेकिन कई एपडिर्स के साथ।डांसर perl

मेरे परियोजना निर्देशिका 'foo' में है:

या मैं कुछ इस तरह कर सकता है। और मान लें कि मेरे पास एक डीआईआर 'बार' है ('foo' के अंदर नहीं) जिसमें 'सार्वजनिक' नामक निर्देशिका है। मैं इस ऐप को अपने लोगों के रूप में उपयोग करने के लिए अपना ऐप 'foo' क्या करता हूं और यदि यह '/ css/style.css' कहता है और यह '/ bar/public /' में नहीं है, तो उसे '/ foo/जनता/'। मैं उसे कैसे कर सकता हूँ?

उत्तर

2

स्थिर तरीके से प्रस्तुत करने वाली प्लगइन लिखने के तरीकों में से एक तरीका (और कुछ कार्यक्षमता को प्रतिस्थापित करता है)। उदाहरण के तौर पर आप Dancer::Plugin::Thumbnail का उपयोग कर सकते हैं।

अन्य तरीकों से मैं देखता हूं बंदर-पैच get_file_response()Dancer::Renderer पर जो वास्तव में ऐसा अच्छा विचार नहीं है।

निम्नलिखित कोड @dirs सरणी से प्रत्येक डीआईआर में स्थैतिक फ़ाइलों की तलाश करता है। यह गंदे, बदसूरत और असुरक्षित है। इसे भविष्य के संस्करण में तोड़ा जा सकता है और डांसर फ्रेमवर्क के अन्य हिस्सों में समस्याएं पैदा हो सकती हैं जिन्हें मैं परिचित नहीं हूं। आपको चेतावनी दी गई है।

#!/usr/bin/env perl 
use Dancer; 
use Dancer::Renderer; 
use MyWeb::App; 

my $get_file_response_original = \&Dancer::Renderer::get_file_response; 
my @dirs = ('foo'); 

*Dancer::Renderer::get_file_response = sub { 
    my $app = Dancer::App->current; 

    my $result; 

    # Try to find static in default dir 
    if ($result = $get_file_response_original->(@_)) { 
     return $result; 
    } 

    # Save current settings 
    my $path_backup = $app->setting('public'); 

    # Go through additional dirs 
    foreach my $dir (@dirs) { 
     $app->setting(public => $dir); 
     if ($result = $get_file_response_original->(@_)) { 
      last; 
     } 
    } 

    # Restore public 
    $app->setting('public' => $path_backup); 

    return $result 
}; 

dance; 

तीसरे तरीके nginx को आपके आवेदन के लिए उचित nginx कॉन्फ़िगर लिखकर यह काम करने दें।

+0

में होगा विचार है कि दोनों निर्देशिका अलग रहने चाहिए कर सकते हैं। – bliof

+0

@bliof मैंने अपना जवाब अपडेट किया है, आप इसे आजमा सकते हैं, लेकिन बेहतर आप nginx के साथ जाते हैं। – yko

+0

मैं कुछ और सोच रहा था। क्या मैं एक प्लगइन 'foo' बना सकता हूं और इसे 'बार' में उपयोग कर सकता हूं? वास्तविक सवाल यह है कि डांसर प्लगइन में नर्तक ऐप की कार्यक्षमता होती है। मेरा मतलब है कि मैं उससे यूआरएल मैप कर सकता हूं और अपने 'विचार' फ़ोल्डर से टेम्पलेट लोड कर सकता हूं?/मैंने कभी प्लगइन/ – bliof

7

ठीक है, यह करने का अच्छा तरीका है। यह निश्चित रूप से एक प्लगइन हो सकता है।

आप डांसर की कोर के अंदर हैकिंग से बातें इस तरह कभी नहीं करना चाहिए, यदि आप इसके बजाय हमेशा एक मार्ग हैंडलर को लागू करने काम करने के लिए विचार करना चाहिए:

#!/usr/bin/env perl 
use Dancer; 
use File::Spec; 
use Dancer::FileUtils 'read_file_content'; 
use Dancer::MIME; 
use HTTP::Date; 

# your routes here 

# then the catchall route for 
# serving static files 

# better in config 
my @public_dirs = qw(/tmp/test/foo /tmp/test/bar /tmp/test/baz); 

get '/**' => sub { 
    my $path = request->path; 
    my $mime = Dancer::MIME->instance; 

    # security checks 
    return send_error("unauthrorized request", 403) if $path =~ /\0/; 
    return send_error("unauthrorized request", 403) if $path =~ /\.\./; 

    # decompose the path_info into a file path 
    my @path = split '/', $path; 

    for my $location (@public_dirs) { 
     my $file_path = File::Spec->catfile($location, @path); 

     next if ! -f $file_path; 

     my $content = read_file_content($file_path); 
     my $content_type = $mime->for_file($file_path); 
     my @stat = stat $file_path; 

     header 'Content-Type', $content_type; 
     header 'Content-Length', $stat[7]; 
     header 'Last-Modified', HTTP::Date::time2str($stat[9]); 
     return $content; 
    } 

    pass; 
}; 

start; 

इस अनुप्रयोग चल रहा का एक उदाहरण:

$ mkdir -p /tmp/test/foo /tmp/test/bar /tmp/test/baz 
$ echo 1 > /tmp/test/foo/foo.txt 
$ echo 2 > /tmp/test/bar/bar.txt 
$ echo 3 > /tmp/test/baz/baz.txt 
$ ./bin/app.pl 
$ curl -I http://0:3000/baz.txt 
HTTP/1.0 200 OK 
Content-Length: 2 
Content-Type: text/plain 
Last-Modified: Fri, 14 Oct 2011 11:28:03 GMT 
X-Powered-By: Perl Dancer 1.3051 
-1

क्या यह मॉड्यूल आपकी मदद करेगा? https://github.com/Perlover/Dancer-Plugin-Hosts आप खुद appdir & अन्य निर्देशिका सेटिंग्स साथ डांसर में सेटअप आभासी साइटों मैं इस मॉड्यूल आज अपलोड जल्द ही GitHub के लिए CPAN