2010-08-08 9 views
44

मुझे जिंजा 2 और मको की अच्छी तुलना नहीं मिली। आप किस कार्यों के लिए उपयोग करेंगे?मको या Jinja2?

मैं व्यक्तिगत रूप से mako (एक पिलों वेब ऐप संदर्भ में) से संतुष्ट था, लेकिन यह जानकर उत्सुकता है कि जिंजा 2 में कुछ अच्छी विशेषताएं/सुधार हैं जो मको नहीं करता है? या शायद डाउनसाइड्स? -

उत्तर

38

मैं व्यक्तिगत रूप से मको के ऊपर जिन्जा 2 के वाक्यविन्यास को प्राथमिकता देता हूं। Mako website

<%inherit file="base.html"/> 
<% 
    rows = [[v for v in range(0,10)] for row in range(0,10)] 
%> 
<table> 
    % for row in rows: 
     ${makerow(row)} 
    % endfor 
</table> 

<%def name="makerow(row)"> 
    <tr> 
    % for name in row: 
     <td>${name}</td>\ 
    % endfor 
    </tr> 
</%def> 

से इस उदाहरण लें यहां इतने सारे निर्माणों कि मैं प्रलेखन से परामर्श करने से पहले मैं भी शुरू हो सकता है के लिए होगा रहे हैं। कौन से टैग <% की तरह शुरू होते हैं और /> के साथ बंद होते हैं? उनमें से किस को %> के साथ बंद करने की अनुमति है? जब मैं एक चर (${foo}) आउटपुट करना चाहता हूं तो टेम्पलेट भाषा में प्रवेश करने का एक और तरीका क्यों है? इस के साथ क्या है एक्सएमएल जहां कुछ निर्देश टैग की तरह बंद हैं और गुण हैं?

{% extends "base.html" %} 

<table> 
    {% for row in rows %} 
    {{ makerow(row) }} 
    {% endfor %} 
</table> 

{% macro make_row(row) %} 
    <tr> 
    {% for name in row %} 
     <td>{{ name }}</td>  
    {% endfor %} 
    </tr> 
{% endmacro %} 

Jinja2 फिल्टर, जो मैं मैको बताया हूँ भी लेकिन मैं उन्हें नहीं देखा है गया है:

यह Jinja2 में बराबर उदाहरण है। फ़िल्टर फ़ंक्शंस नियमित कार्यों की तरह कार्य नहीं करते हैं, वे फ़िल्टर किए जाने वाले मान का एक अनुमानित पहला पैरामीटर लेते हैं। इस प्रकार माको में आप लिख सकते हैं:

${escape(default(get_name(user), "No Name"))} 

यह भयानक है। Jinja2 में आप लिखेंगे:

{{ user | get_name | default('No Name') | escape }} 

मेरी राय में, Jinja2 उदाहरण अत्यधिक पढ़ने योग्य हैं। Jinja2 अधिक नियमित है, उस टैग में प्रसंस्करण और नियंत्रण निर्देशों के लिए {% %} के साथ, या {{ }} चर के आउटपुट के लिए अनुमानित तरीके से शुरू होता है और समाप्त होता है।

लेकिन ये सभी व्यक्तिगत प्राथमिकताएं हैं। मुझे मोनो पर या इसके विपरीत, Jinja2 लेने के लिए एक और अधिक महत्वपूर्ण कारण नहीं पता है। और पिलोन काफी अच्छा है कि आप या तो उपयोग कर सकते हैं!

अद्यतन में Jinja2 मैक्रोज़ शामिल थे। हालांकि किसी भी मामले में, मेरी राय में Jinja2 उदाहरण पढ़ने और समझना आसान है। माको का मार्गदर्शक दर्शन "पायथन एक महान पटकथा भाषा है। पहिया को फिर से न लगाएं ... आपके टेम्पलेट इसे संभाल सकते हैं!" लेकिन जिनजा 2 के मैक्रोज़ (वास्तव में पूरी भाषा) वास्तव में पाइथन की तरह दिखती है कि माको करता है!

+6

वास्तव में उचित नहीं है: आपके "जिन्जा में समतुल्य" में माको उदाहरण से आधा सामान शामिल नहीं है और इस प्रकार कम दिखता है। मको का <% /> 'बनाम' <% %> 'यह भ्रमित नहीं है (ब्लॉक बनाम इनलाइन कोड)। मको में फ़िल्टर फ़ंक्शन भी हैं और वे वही दिखते हैं। –

+0

मैंने कहा कि ये व्यक्तिगत वरीयता के मामले हैं, आप यह दिखाने के लिए स्वतंत्र हैं कि माको का वाक्यविन्यास आपके लिए अधिक समझ में आता है। मैंने मेकरो की परिभाषा शामिल नहीं की क्योंकि यह जिन्जा में एक टेम्पलेट का हिस्सा नहीं है। –

+0

@ जेसे - निष्पक्ष होने के लिए, Jinja2 उदाहरण के लिए 'मेकरो' नामक एक मैक्रो को परिभाषित और उपयोग क्यों नहीं करें? ** देखें: ** http://jinja.pocoo.org/2/documentation/templates#macros –

5

wheezy.template उदाहरण पर एक नज़र डालें:

@require(user, items) 
Welcome, @user.name! 
@if items: 
    @for i in items: 
     @i.name: @i.price!s. 
    @end 
@else: 
    No items found. 
@end 

यह प्रदर्शन (अधिक here और here), अच्छी तरह से परीक्षण किया और प्रलेखित लिए अनुकूलित है।

+0

यह अच्छा लग रहा है, लेकिन पीपी पर उपलब्ध संस्करण काफी पुराना है: https://pypi.python.org/pypi/wheezy.template – nowox