2010-08-08 25 views
44

Tôi không tìm thấy so sánh tốt về jinja2 và Mako. Những gì bạn sẽ sử dụng cho những nhiệm vụ?Mako hoặc Jinja2?

Tôi personnaly đã hài lòng bởi mako (trong ngữ cảnh ứng dụng web giá treo) nhưng tôi tò mò muốn biết liệu jinja2 có một số tính năng/cải tiến tốt đẹp mà mako không? -

Trả lời

38

Cá nhân tôi thích cú pháp của Jinja2 hơn Mako. Hãy ví dụ này từ 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> 

Có rất nhiều cấu trúc ở đây là tôi sẽ phải tham khảo tài liệu trước khi tôi thậm chí có thể bắt đầu. Những thẻ nào bắt đầu như <% và đóng với />? Nội dung nào được phép đóng với %>? Tại sao có cách nào khác để nhập ngôn ngữ mẫu khi tôi muốn xuất một biến (${foo})? Có gì với số này faux XML nơi một số chỉ thị gần giống như thẻ và có thuộc tính?

Đây là ví dụ tương đương trong Jinja2:

{% 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 có bộ lọc, mà tôi đang nói với Mako cũng đã nhưng tôi đã không nhìn thấy chúng. Các hàm lọc không hoạt động như các hàm thông thường, chúng lấy một tham số đầu tiên tiềm ẩn của giá trị đang được lọc. Như vậy trong Mako bạn có thể viết:

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

Điều đó thật kinh khủng. Trong Jinja2 bạn sẽ viết:

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

Theo tôi, các ví dụ Jinja2 có thể đọc được nhiều hơn. Jinja2 thường xuyên hơn, trong các thẻ đó bắt đầu và kết thúc theo cách có thể dự đoán được, hoặc với {% %} để xử lý và kiểm soát chỉ thị hoặc {{ }} để xuất các biến.

Nhưng đây là tất cả các tùy chọn cá nhân. Tôi không biết một lý do quan trọng nào khác để chọn Jinja2 qua Mako hay ngược lại. Và giá treo là đủ lớn để bạn có thể sử dụng!

Cập nhật bao gồm các macro Jinja2. Mặc dù có bất kỳ trường hợp nào, theo tôi, ví dụ Jinja2 dễ đọc và dễ hiểu hơn. Triết lý hướng dẫn của Mako là "Python là một ngôn ngữ kịch bản tuyệt vời. Đừng phát minh lại bánh xe ... các mẫu của bạn có thể xử lý nó!" Nhưng các macro của Jinja2 (toàn bộ ngôn ngữ, thực sự) trông giống như Python mà Mako làm!

+6

Không thực sự công bằng: "Tương đương trong Jinja" của bạn đã loại trừ một nửa nội dung từ ví dụ Mako và do đó trông ngắn hơn. Mako '<% /> 'vs' <% %>' không gây nhầm lẫn (khối vs mã nội tuyến). Mako cũng có chức năng lọc và trông chúng giống nhau. –

+0

Tôi đã nói đây là những vấn đề về sở thích cá nhân, bạn được tự do thể hiện cách cú pháp của Mako có ý nghĩa hơn với bạn. Tôi không bao gồm định nghĩa của makerow bởi vì đó không phải là một phần của một mẫu trong Jinja. –

+0

@Jesse - để công bằng, tại sao không xác định và sử dụng macro được gọi là 'makerow' cho ví dụ Jinja2? ** Xem: ** http://jinja.pocoo.org/2/documentation/templates#macros –

5

Hãy xem wheezy.template dụ:

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

Nó được tối ưu hóa cho hiệu suất (hơn herehere), cũng thử nghiệmghi.

+0

Có vẻ đẹp, nhưng phiên bản có sẵn trên pip khá lỗi thời: https://pypi.python.org/pypi/wheezy.template – nowox