2015-10-07 14 views
5

मैं कुछ वेब एपीआई लिखने की प्रक्रिया में हूं, जो जेएसओएन प्रारूप में डेटा देता है।सभी आने वाले यूआरएल के लिए आम हैंडलर कैसे बनाएं?

सभी आने वाले यूआरएल के लिए मुझे कैश की अवधि समाप्त होने पर कैश से कुछ परिणाम वापस करने की आवश्यकता है।

यह तर्क सभी यूआरएल के लिए सार्वभौमिक है।

प्रश्न:

कैसे Mojolicious :: लाइट में आने वाले सभी यूआरएल के लिए कुछ सामान्य तर्क लागू करने के लिए?

मैं

any '/:bar' => [bar => qr/.+/] => sub { 
# ... 
# Return JSON object immediately from cache if it is applicable 
# ... 
} 

करने की कोशिश की लेकिन यह करने के लिए बहुत लंबे समय पेज लोड हो रहा है और

Template "bar.html.ep" not found 

ओर जाता है morbo लॉग में (लेकिन हो "/ लक्ष्य" हैंडलर, अंत में निष्पादित किया जाएगा बहुत लंबे समय के बाद देरी)।

मैं मोजो में एक आदर्श नौसिखिया हूँ, इसलिए किसी भी मदद की सराहना की होगी

धन्यवाद!

+3

आप हमें अपने हैंडलर में कोड दिखा सकते हैं में मदद मिलेगी मिलेगा? Mojolicious JSON वापस करने के लिए 'html.ep' टेम्पलेट नहीं ढूंढना चाहिए। क्या आपका हैंडलर '$ self-> रेंडर (json => $ ऑब्जेक्ट) के साथ समाप्त होता है; '? – mob

+0

मुझे लगता है, http://mojolicio.us/perldoc/Mojolicious/Guides/Routing#Hooks मेरी मदद कर सकते हैं। लेकिन क्या यह मोजो के लाइट संस्करण द्वारा समर्थित है? .. – drvtiny

उत्तर

2

हां, before_dispatch हुक सही दृष्टिकोण की तरह लगता है, और यह Mojolicious::Lite के साथ काम करता है। यहां एक सबूत-ऑफ-अवधारणा है जो प्रत्येक अद्वितीय अनुरोध के लिए एक नया परिणाम प्रस्तुत करेगी, लेकिन बार-बार अनुरोधों के लिए परिणाम दोहराएं। इस कार्यक्रम में, नियमित अनुरोध हैंडलर कैश को पॉप्युलेट करता है, लेकिन यदि आप उस भाग को अपने कोड के मुख्य कार्यों से अलग करना चाहते हैं तो आप after_dispatch हुक में कैशिंग कर सकते हैं।

use Mojolicious::Lite; 

our %CACHE; 

any '/:any' => sub { 
    my $self = shift; 
    my $param = $self->param('any'); 
    my $result = { reqtime => time, param => $param, number => rand }; 
    my $path = $self->req->url->path->to_string; 
    $CACHE{$path} //= $result; 
    $self->render(json => $result); 
}; 

app->hook(before_dispatch => sub { 
    my $c = shift; 
    my $path = $c->req->url->path->to_string; 
    if (defined($CACHE{$path})) { 
     $c->render(json => $CACHE{$path}, status => 200); 
    } 
}); 
app->secrets([42])->start; 

नमूना रन:

$ morbo cachedemo.pl >/dev/null 2>&1 & 

$ for req in foo foo1 foo2 foo3 foo foo1 
> do curl http://localhost:3000/$req ; echo ; sleep 1 ; done 

{"number":0.075227,"reqtime":1444254617,"param":"foo"} 
{"number":0.0745738560703799,"reqtime":1444254618,"param":"foo1"} 
{"number":0.484934245556467,"reqtime":1444254619,"param":"foo2"} 
{"number":0.181112856445004,"reqtime":1444254620,"param":"foo3"} 
{"number":0.075227,"reqtime":1444254617,"param":"foo"}  <-- dup 
{"number":0.0745738560703799,"reqtime":1444254618,"param":"foo1"} <-- dup 
+0

यह आश्चर्यजनक है, बहुत बहुत धन्यवाद! मुझे पर्ल में "// =" निर्माण के बारे में पता नहीं था और ऐप-> रहस्य (["somesecret"]) के रूप में ऐप शुरू करने की संभावना के बारे में पता नहीं था -> शुरू करें ... क्या आप मुझे बता सकते हैं कि, after_dispatch के निष्पादन से कैसे बचें pre_dispatch हुक में प्रतिपादन करने के बाद हुक? आपका अग्रिम में ही बहुत धन्यवाद! – drvtiny

1

आप * प्लेसहोल्डर उपयोग कर सकते हैं। देखो डेवलपर mode में here

इसके अलावा, आप आवेदन कर दिया:

Mojolicious->new(mode => 'developer'); 
$app->mode('developer'); 

आप बहुत 404, 500 पृष्ठों आपका बहुत-बहुत

संबंधित मुद्दे