2011-11-21 25 views
8

Tôi đã cố gắng tìm hiểu thêm về động cơ templating của Django vì nó luôn luôn có vẻ giống như một chút của một hộp đen với tôi. The documentation đưa ra một phác thảo tốt về các bước chung có liên quan và chỉ ra rằng mẫu được tải và phân tích cú pháp, tạo một cây nút được kết xuất (trong một tầng?) Với ngữ cảnh và nối với nhau để cho kết quả.Các mẫu django được phân tích cú pháp như thế nào?

Điều tôi không hiểu là cách tiếp cận phân tích cú pháp và theo tiêu chí nào các nút được tạo? Điều gì cấu thành một nút cụ thể sau khi phân tích cú pháp và điều này ảnh hưởng đến việc tạo các thẻ mẫu tùy chỉnh (tức là có cách tốt hơn và hiệu quả hơn để viết các thẻ mẫu có thể dẫn đến các nút ít hơn?).

+0

Tôi bắt đầu đọc 'django.template.base' nhưng đã nhận ra ngay sau khi tôi cảm nhận được phép thuật uốn cong mạnh mẽ, thời gian (như goto 5am). Tôi sẽ upvote và kiểm tra vào buổi sáng thay vì :) –

+0

Tôi đã đặt nó vào danh sách việc cần làm của tôi! –

Trả lời

2

Tôi nghĩ rằng điều đầu tiên bạn nên xem là code.djangoproject.com với django/template/base.py - lần đầu tiên (như Yuji Tomita đã nêu trước đó). Hoặc tải xuống các nguồn và xem qua nó với trình soạn thảo hoặc IDE yêu thích của bạn.

3

Một cách để hiểu thêm về quy trình này là chạy django với werkzeug debugger và kích hoạt ngoại lệ trong mẫu. Bằng cách đó, bạn sẽ có thể xem (và tương tác) với toàn bộ ngăn xếp đến thời điểm đó.

0

Tôi đoán họ sử dụng tokenizing và phân tích

một cách đơn giản để mô tả là:

tokenizing: nghỉ Appart mã với các loại như:

integer foo = "bar" + 15; 

này bao gồm

T_VARIABLETYPE + T_VARIABLENAME + T_EQUALS + T_STRING + T_PLUS + T_DIGIT + T_SEMI 

sau này bạn có thể phân tích bằng tryin g để tìm mô hình với một cú pháp

phân tích cú pháp:

tìm ra mô hình:

T_VARIABLETYPE + T_VARIABLENAME + T_EQUALS + {A recursive thing} + T_SEMI 

Bằng cách này bạn có thể thực hiện một lệnh

Nếu bạn muốn thử nghiệm với điều này tôi có thể khuyên bạn nên sử dụng "ANTLR" http://www.antlr.org/ Có sẵn nhiều ngôn ngữ khác nhau như Java hoặc C# và thậm chí là PHP và JS

3

Một nút được tạo ra từ mỗi thẻ. Bạn có thể có được ý tưởng về cách hoạt động của nó bằng cách đọc qua how to write custom tags. Bất cứ thứ gì bên trong thẻ sẽ là con của nó. Dưới đây là ví dụ về thẻ nhận xét từ tài liệu django:

def do_comment(parser, token): 
    nodelist = parser.parse(('endcomment',)) 
    parser.delete_first_token() 
    return CommentNode() 

khi bạn thấy thẻ nhận xét sẽ phân tích mọi thứ cho đến khi "kết thúc" và sẽ vứt đi. Các thẻ khác sẽ vượt qua nodelist đến SometagNode() và sẽ sử dụng thẻ để hiển thị.

Hiển thị được thực hiện đệ quy. Khi một render() được gọi trên nút nó chạy render trên các con của nó và cứ thế.

Phân tích cú pháp được thực hiện một cách đệ quy, đây là lý do tại sao bạn có thể nhận thẻ lồng nhau và parser.parse() sẽ quản lý để tìm thẻ đóng phù hợp phù hợp, vì khi phân tích cú pháp và tình cờ trên thẻ gọi là do_tag(). các parser.parse() một lần nữa để tìm thẻ đóng gần nhất và sẽ bọc tất cả mọi thứ vào một nút, trả về một nút, parser.parse cao hơn() sẽ đặt nó vào một danh sách nút và sẽ tiếp tục tìm kiếm thẻ đóng.

Đối tượng ngữ cảnh trong các nút là một loại danh sách cấu trúc dicts. Thêm bối cảnh được đẩy trên đầu trang của bối cảnh hiện tại và thông qua cho các nút trẻ em và popped ra sau khi nút được trả lại để nó sẽ không ảnh hưởng đến phạm vi trên.

Đối với các thẻ không có trẻ em, parser.parse() không được sử dụng và do đó, thể hiện nút được trả về mà không có bất kỳ trẻ em nào.

Các vấn đề liên quan