Flask tận dụng Jinja2 làm công cụ mẫu của nó. Rõ ràng là bạn có thể tự do sử dụng một công cụ mẫu khác, nhưng bạn vẫn phải cài đặt Jinja2 để tự chạy Flask. Yêu cầu này là cần thiết để bật tiện ích mở rộng phong phú. Một tiện ích mở rộng có thể phụ thuộc vào sự hiện diện của Jinja2
Phần này chỉ giới thiệu rất nhanh về cách Jinja2 được tích hợp vào Flask. Nếu bạn muốn biết thông tin về chính cú pháp của công cụ mẫu, hãy truy cập Tài liệu mẫu Jinja2 chính thức để biết thêm thông tin
Thiết lập Jinja
Trừ khi được tùy chỉnh, Jinja2 được cấu hình bởi Flask như sau
autoescaping được bật cho tất cả các mẫu kết thúc bằng
.html
,.htm
,{% autoescape false %} autoescaping is disabled here {{ will_not_be_escaped }} {% endautoescape %}
0,{% autoescape false %} autoescaping is disabled here {{ will_not_be_escaped }} {% endautoescape %}
1, cũng như{% autoescape false %} autoescaping is disabled here {{ will_not_be_escaped }} {% endautoescape %}
2 khi sử dụng{% autoescape false %} autoescaping is disabled here {{ will_not_be_escaped }} {% endautoescape %}
3autoescaping được bật cho tất cả các chuỗi khi sử dụng
{% autoescape false %} autoescaping is disabled here {{ will_not_be_escaped }} {% endautoescape %}
4một mẫu có khả năng chọn tham gia/không tự động thoát bằng thẻ
{% autoescape false %} autoescaping is disabled here {{ will_not_be_escaped }} {% endautoescape %}
5Flask chèn một vài hàm toàn cầu và trình trợ giúp vào ngữ cảnh Jinja2, ngoài các giá trị có sẵn theo mặc định
Bối cảnh tiêu chuẩn
Theo mặc định, các biến toàn cầu sau đây có sẵn trong các mẫu Jinja2
cấu hìnhĐối tượng cấu hình hiện tại []
Nhật ký thay đổiĐã thay đổi trong phiên bản 0. 10. Tính năng này hiện luôn khả dụng, ngay cả trong các mẫu đã nhập.
Mới trong phiên bản 0. 6
lời yêu cầuĐối tượng yêu cầu hiện tại []. Biến này không khả dụng nếu mẫu được hiển thị mà không có ngữ cảnh yêu cầu đang hoạt động
phiên họpĐối tượng phiên hiện tại []. Biến này không khả dụng nếu mẫu được hiển thị mà không có ngữ cảnh yêu cầu đang hoạt động
Đối tượng ràng buộc yêu cầu cho các biến toàn cục []. Biến này không khả dụng nếu mẫu được hiển thị mà không có ngữ cảnh yêu cầu đang hoạt động
url_for[]Chức năng
get_flashed_messages[]Chức năng
Hành vi bối cảnh Jinja
Các biến này được thêm vào ngữ cảnh của các biến, chúng không phải là biến toàn cục. Sự khác biệt là theo mặc định, chúng sẽ không hiển thị trong ngữ cảnh của các mẫu đã nhập. Điều này một phần là do cân nhắc về hiệu suất, một phần là để giữ mọi thứ rõ ràng
Điều này có ý nghĩa gì với bạn?
bạn rõ ràng chuyển yêu cầu tới macro dưới dạng tham số hoặc thuộc tính của đối tượng yêu cầu mà bạn quan tâm
bạn nhập macro "có ngữ cảnh"
Nhập khẩu với bối cảnh trông như thế này
{% from '_helpers.html' import my_macro with context %}
Kiểm soát thoát tự động
Autoescaping là khái niệm tự động thoát các ký tự đặc biệt cho bạn. Các ký tự đặc biệt theo nghĩa của HTML [hoặc XML, và do đó là XHTML] là
@app.template_filter['reverse'] def reverse_filter[s]: return s[::-1] def reverse_filter[s]: return s[::-1] app.jinja_env.filters['reverse'] = reverse_filter2,
@app.template_filter['reverse'] def reverse_filter[s]: return s[::-1] def reverse_filter[s]: return s[::-1] app.jinja_env.filters['reverse'] = reverse_filter3,
@app.template_filter['reverse'] def reverse_filter[s]: return s[::-1] def reverse_filter[s]: return s[::-1] app.jinja_env.filters['reverse'] = reverse_filter4,
@app.template_filter['reverse'] def reverse_filter[s]: return s[::-1] def reverse_filter[s]: return s[::-1] app.jinja_env.filters['reverse'] = reverse_filter5 cũng như
@app.template_filter['reverse'] def reverse_filter[s]: return s[::-1] def reverse_filter[s]: return s[::-1] app.jinja_env.filters['reverse'] = reverse_filter6. Vì các ký tự này tự chúng mang ý nghĩa cụ thể trong tài liệu nên bạn phải thay thế chúng bằng cái gọi là "thực thể" nếu bạn muốn sử dụng chúng cho văn bản. Không làm như vậy không chỉ khiến người dùng thất vọng vì không thể sử dụng các ký tự này trong văn bản mà còn có thể dẫn đến các vấn đề về bảo mật. [thấy ]
Tuy nhiên, đôi khi bạn sẽ cần phải tắt tính năng thoát tự động trong các mẫu. Đây có thể là trường hợp nếu bạn muốn đưa HTML vào các trang một cách rõ ràng, chẳng hạn nếu chúng đến từ một hệ thống tạo HTML an toàn như trình chuyển đổi đánh dấu sang HTML
Có ba cách để thực hiện điều đó
Trong mã Python, bọc chuỗi HTML trong một đối tượng trước khi chuyển nó tới mẫu. Đây nói chung là cách được khuyến nghị
Bên trong mẫu, sử dụng bộ lọc
@app.template_filter['reverse'] def reverse_filter[s]: return s[::-1] def reverse_filter[s]: return s[::-1] app.jinja_env.filters['reverse'] = reverse_filter
8 để đánh dấu rõ ràng một chuỗi là HTML an toàn [@app.template_filter['reverse'] def reverse_filter[s]: return s[::-1] def reverse_filter[s]: return s[::-1] app.jinja_env.filters['reverse'] = reverse_filter
9]Tạm thời vô hiệu hóa hoàn toàn hệ thống autoescape
Để tắt hệ thống thoát tự động trong các mẫu, bạn có thể sử dụng khối
{% autoescape false %} autoescaping is disabled here {{ will_not_be_escaped }} {% endautoescape %}5
{% autoescape false %} autoescaping is disabled here {{ will_not_be_escaped }} {% endautoescape %}
Bất cứ khi nào bạn làm điều này, vui lòng hết sức thận trọng về các biến bạn đang sử dụng trong khối này
Đăng ký bộ lọc
Nếu bạn muốn đăng ký bộ lọc của riêng mình trong Jinja2, bạn có hai cách để làm điều đó. Bạn có thể đặt chúng bằng tay vào ứng dụng hoặc sử dụng công cụ trang trí
Hai ví dụ sau hoạt động giống nhau và cả hai đều đảo ngược một đối tượng
@app.template_filter['reverse'] def reverse_filter[s]: return s[::-1] def reverse_filter[s]: return s[::-1] app.jinja_env.filters['reverse'] = reverse_filter
Trong trường hợp trình trang trí, đối số là tùy chọn nếu bạn muốn sử dụng tên hàm làm tên của bộ lọc. Sau khi đăng ký, bạn có thể sử dụng bộ lọc trong các mẫu của mình theo cách tương tự như các bộ lọc dựng sẵn của Jinja2, ví dụ: nếu bạn có một danh sách Python trong ngữ cảnh được gọi là mylist
{% for x in mylist | reverse %} {% endfor %}
Bộ xử lý bối cảnh
Để tự động đưa các biến mới vào ngữ cảnh của mẫu, bộ xử lý ngữ cảnh tồn tại trong Flask. Bộ xử lý ngữ cảnh chạy trước khi mẫu được hiển thị và có khả năng đưa các giá trị mới vào ngữ cảnh mẫu. Bộ xử lý ngữ cảnh là một hàm trả về từ điển. Các khóa và giá trị của từ điển này sau đó được hợp nhất với ngữ cảnh mẫu cho tất cả các mẫu trong ứng dụng
@app.context_processor def inject_user[]: return dict[user=g.user]
Bộ xử lý ngữ cảnh ở trên cung cấp một biến có tên là người dùng trong mẫu với giá trị là g. người sử dụng. Ví dụ này không thú vị lắm vì dù sao g cũng có sẵn trong các mẫu, nhưng nó đưa ra ý tưởng về cách thức hoạt động của nó
Các biến không giới hạn giá trị;
@app.context_processor def utility_processor[]: def format_price[amount, currency="€"]: return f"{amount:.2f}{currency}" return dict[format_price=format_price]
Trình xử lý ngữ cảnh ở trên cung cấp hàm format_price cho tất cả các mẫu
{{ format_price[0.33] }}
Bạn cũng có thể tạo format_price làm bộ lọc mẫu [xem phần ], nhưng điều này minh họa cách chuyển các hàm trong bộ xử lý ngữ cảnh
truyền trực tuyến
Có thể hữu ích nếu không hiển thị toàn bộ mẫu dưới dạng một chuỗi hoàn chỉnh, thay vào đó hiển thị dưới dạng luồng, tạo ra các chuỗi gia tăng nhỏ hơn. Điều này có thể được sử dụng để truyền phát HTML theo khối để tăng tốc độ tải trang ban đầu hoặc để tiết kiệm bộ nhớ khi hiển thị một mẫu rất lớn
Công cụ mẫu Jinja2 hỗ trợ hiển thị từng mẫu một, trả về một chuỗi lặp. Flask cung cấp các chức năng và để làm cho điều này dễ sử dụng hơn
from flask import stream_template @app.get["/timeline"] def timeline[]: return stream_template["timeline.html"]
Các chức năng này tự động áp dụng trình bao bọc nếu một yêu cầu đang hoạt động, để nó vẫn có sẵn trong mẫu