Mẫu là một thành phần thiết yếu trong phát triển web đầy đủ. Với Jinja, bạn có thể xây dựng các mẫu phong phú cung cấp năng lượng cho mặt trước của các ứng dụng web Python của bạn.Jinja, you can build rich templates that power the front end of your Python web applications.
Nhưng bạn không cần phải sử dụng một khung web để trải nghiệm các khả năng của Jinja. Khi bạn muốn tạo các tệp văn bản với nội dung lập trình, Jinja có thể giúp bạn ra ngoài.
Sửa đổi các biến trong Jinja với các bộ lọcfilters
Sử dụng macro để thêm chức năng vào mặt trước của bạnmacros to add functionality to your front end
Nếu bạn muốn đưa kiến thức mới có được của mình về Jinja vào hành động, thì bạn có thể xây dựng một mặt trước cho một bộ rút ngắn URL Fastapi hoặc triển khai ứng dụng bình của bạn cho Heroku.
Bạn cũng có thể xem xét sử dụng Jinja làm công cụ mẫu cho Django. Để tìm hiểu thêm về sự khác biệt giữa công cụ tạo khuôn mẫu của Jinja và Django, hãy truy cập tài liệu của Jinja, về việc chuyển đổi từ các động cơ mẫu khác sang Jinja.
Bạn có trường hợp sử dụng khác mà bạn tận dụng các khả năng mà Jinja cung cấp không? Chia sẻ chúng với cộng đồng Python thực sự trong các ý kiến dưới đây!
Mẫu là một thành phần thiết yếu trong phát triển web đầy đủ. Với Jinja, bạn có thể xây dựng các mẫu phong phú cung cấp năng lượng cho mặt trước của các ứng dụng web Python của bạn.
Nhưng bạn không cần phải sử dụng một khung web để trải nghiệm các khả năng của Jinja. Khi bạn muốn tạo các tệp văn bản với nội dung lập trình, Jinja có thể giúp bạn ra ngoài.
Trong hướng dẫn này, bạn sẽ học cách:template engine. You commonly use template engines for web templates that receive dynamic content from the back end and render it as a static page in the front end.
Bạn sẽ bắt đầu bằng cách tự mình sử dụng Jinja để bao gồm những điều cơ bản của Templating Jinja. Sau đó, bạn sẽ xây dựng một dự án Web Flask cơ bản với hai trang và một thanh điều hướng để tận dụng toàn bộ tiềm năng của Jinja.
Trong suốt hướng dẫn, bạn sẽ xây dựng một ứng dụng ví dụ hiển thị một số tính năng rộng lớn của Jinja. Để xem những gì nó sẽ làm, hãy bỏ qua phần cuối cùng.
Bạn cũng có thể tìm thấy mã nguồn đầy đủ của dự án web bằng cách nhấp vào liên kết bên dưới:
Chọn hệ điều hành của bạn bên dưới và sử dụng lệnh dành riêng cho nền tảng của bạn để thiết lập môi trường ảo:operating system below and use your platform-specific command to set up a virtual environment:
6 phía trước dấu nhắc cho thấy rằng bạn đã kích hoạt thành công môi trường ảo.
Sau khi bạn đã tạo và kích hoạt môi trường ảo của mình, đã đến lúc cài đặt Jinja với
(venv)$ python -m pip install Jinja2
0:
(venv)$ python -m pip install Jinja2
Don Tiết quên
(venv)$ python -m pip install Jinja2
1 ở cuối tên gói. Nếu không, bạn sẽ cài đặt một phiên bản cũ tương thích với Python 3.
Điều đáng chú ý là mặc dù phiên bản chính hiện tại thực sự lớn hơn
(venv)$ python -m pip install Jinja2
1, nhưng gói mà bạn sẽ cài đặt vẫn được gọi là
(venv)$ python -m pip install Jinja2
3. Bạn có thể xác minh rằng bạn đã cài đặt một phiên bản hiện đại của Jinja bằng cách chạy
(venv)$ python -m pip install Jinja2
4:
(venv)$ python -m pip list
Package Version---------- -------Jinja2 3.x...
Để làm cho mọi thứ trở nên khó hiểu hơn, sau khi cài đặt Jinja với chữ hoa
(venv)$ python -m pip install Jinja2
5, bạn phải nhập nó bằng chữ thường
(venv)$ python -m pip install Jinja2
6 trong Python. Hãy thử nó bằng cách mở trình thông dịch Python tương tác và chạy các lệnh sau:
>>>
>>> importJinja2Traceback (most recent call last):...ModuleNotFoundError: No module named 'Jinja2'>>> importjinja2>>> # No error
Khi bạn cố gắng nhập
(venv)$ python -m pip install Jinja2
3, với việc đặt tên chữ hoa mà bạn đã sử dụng để cài đặt jinja, thì bạn sẽ tăng
(venv)$ python -m pip install Jinja2
8. Để nhập gói Jinja vào Python, bạn phải nhập
(venv)$ python -m pip install Jinja2
9 bằng chữ thường
(venv)$ python -m pip install Jinja2
6.
Hiển thị mẫu jinja đầu tiên của bạn
Với Jinja đã nhập, bạn có thể tiếp tục tải và hiển thị mẫu đầu tiên của mình:
>>>
>>> importjinja2>>> environment=jinja2.Environment()>>> template=environment.from_string("Hello, {{ name }}!")>>> template.render(name="World")'Hello, World!'
Khi bạn cố gắng nhập
(venv)$ python -m pip install Jinja2
3, với việc đặt tên chữ hoa mà bạn đã sử dụng để cài đặt jinja, thì bạn sẽ tăng
(venv)$ python -m pip install Jinja2
8. Để nhập gói Jinja vào Python, bạn phải nhập
(venv)$ python -m pip install Jinja2
9 bằng chữ thường
(venv)$ python -m pip install Jinja2
6.
Hiển thị mẫu jinja đầu tiên của bạn
Với Jinja đã nhập, bạn có thể tiếp tục tải và hiển thị mẫu đầu tiên của mình: Load a source that contains placeholder variables. By default, they’re wrapped in a pair of curly brackets (
(venv)$ python -m pip list
Package Version---------- -------Jinja2 3.x...
4).
Thành phần cốt lõi của Jinja là lớp
(venv)$ python -m pip list
Package Version---------- -------Jinja2 3.x...
1. Trong ví dụ này, bạn tạo ra một môi trường Jinja mà không có bất kỳ đối số nào. Sau đó, bạn sẽ thay đổi các tham số của
(venv)$ python -m pip list
Package Version---------- -------Jinja2 3.x...
2 để tùy chỉnh môi trường của bạn. Tại đây, bạn đã tạo ra một môi trường đơn giản nơi bạn tải chuỗi
(venv)$ python -m pip list
Package Version---------- -------Jinja2 3.x...
3 làm mẫu. Fill the placeholders with content. You can provide a dictionary or keyword arguments as context. In this case, you’ve
filled the placeholder so that you get the familiar
(venv)$ python -m pip list
Package Version---------- -------Jinja2 3.x...
5 as output.
Những gì bạn vừa làm có vẻ không ấn tượng hơn nhiều so với việc sử dụng một chuỗi được định dạng trong Python đơn giản. Tuy nhiên, ví dụ này cho thấy hai bước quan trọng mà bạn thường thực hiện khi sử dụng Jinja:
Tải một mẫu: Tải một nguồn chứa các biến giữ chỗ. Theo mặc định, họ đã được bọc trong một cặp dấu ngoặc xoăn ((venv) $ python -m pip list
Package Version
---------- -------
Jinja2 3.x
...
4).
Kết xuất mẫu: Điền vào chỗ giữ chỗ bằng nội dung. Bạn có thể cung cấp một đối số từ điển hoặc từ khóa làm ngữ cảnh. Trong trường hợp này, bạn đã điền vào trình giữ chỗ để bạn nhận được
(venv)$ python -m pip list
Package Version---------- -------Jinja2 3.x...
5 quen thuộc làm đầu ra.
Mẫu nguồn mà bạn đang tải có thể là một chuỗi theo nghĩa đen. Nhưng mọi thứ trở nên thú vị hơn khi bạn làm việc với các tệp và cung cấp một tệp văn bản làm mẫu.
{# templates/message.txt #}
Hello {{ name }}!
I'm happy to inform you that you did very well on today's {{ test_name }}.
You reached {{ score }} out of {{ max_score }} points.
See you tomorrow!
Anke
Sử dụng một tệp bên ngoài làm mẫu
Nếu bạn muốn làm theo cùng với các ví dụ trong hướng dẫn này, thì bạn có thể tiếp tục và tạo một thư mục mới để làm việc. Bên trong thư mục làm việc của bạn, hãy tạo một thư mục có tên
(venv)$ python -m pip list
Package Version---------- -------Jinja2 3.x...
6.
# write_messages.pyfromjinja2importEnvironment,FileSystemLoadermax_score=100test_name="Python Challenge"students=[{"name":"Sandrine","score":100},{"name":"Gergeley","score":87},{"name":"Frieda","score":92},]environment=Environment(loader=FileSystemLoader("templates/"))template=environment.get_template("message.txt")forstudentinstudents:filename=f"message_{student['name'].lower()}.txt"content=template.render(student,max_score=max_score,test_name=test_name)withopen(filename,mode="w",encoding="utf-8")asmessage:message.write(content)print(f"... wrote {filename}")
Bạn sẽ lưu trữ bất kỳ mẫu sắp tới nào trong thư mục
(venv)$ python -m pip list
Package Version---------- -------Jinja2 3.x...
6. Bây giờ tạo một tệp văn bản có tên
(venv)$ python -m pip list
Package Version---------- -------Jinja2 3.x...
8:
Hãy tưởng tượng rằng bạn là một giáo viên muốn gửi kết quả cho các sinh viên hoạt động tốt. Mẫu
(venv)$ python -m pip list
Package Version---------- -------Jinja2 3.x...
8 chứa bản thiết kế cho tin nhắn mà bạn có thể sao chép và dán để gửi sau. Giống như trong ví dụ
(venv)$ python -m pip list
Package Version---------- -------Jinja2 3.x...
5, bạn tìm thấy niềng răng xoăn (
(venv)$ python -m pip list
Package Version---------- -------Jinja2 3.x...
4) trong văn bản mẫu của bạn.
Tiếp theo, tạo một tệp Python có tên
>>> importJinja2Traceback (most recent call last):...ModuleNotFoundError: No module named 'Jinja2'>>> importjinja2>>> # No error
>>> importJinja2Traceback (most recent call last):...ModuleNotFoundError: No module named 'Jinja2'>>> importjinja2>>> # No error
8, cùng với
>>> importJinja2Traceback (most recent call last):...ModuleNotFoundError: No module named 'Jinja2'>>> importjinja2>>> # No error
9 và
>>> importjinja2>>> environment=jinja2.Environment()>>> template=environment.from_string("Hello, {{ name }}!")>>> template.render(name="World")'Hello, World!'
0, khớp với các biến mẫu trong
(venv)$ python -m pip list
Package Version---------- -------Jinja2 3.x...
8. Nếu bạn không cung cấp ngữ cảnh cho các biến trong một mẫu, họ không có lỗi. Nhưng chúng hiển thị một chuỗi trống, thường không mong muốn.
Khi bạn gọi >>> import jinja2
>>> environment = jinja2.Environment()
>>> template = environment.from_string("Hello, {{ name }}!")
>>> template.render(name="World")
'Hello, World!'
2, bạn trả về mẫu được hiển thị dưới dạng chuỗi. Như với bất kỳ chuỗi nào khác, bạn có thể sử dụng >>> import jinja2
>>> environment = jinja2.Environment()
>>> template = environment.from_string("Hello, {{ name }}!")
>>> template.render(name="World")
'Hello, World!'
3 để ghi nó vào một tệp. Để xem >>> import Jinja2
Traceback (most recent call last):
...
ModuleNotFoundError: No module named 'Jinja2'
>>> import jinja2
>>> # No error
2 trong hành động, hãy chạy tập lệnh:
Bạn vừa tạo một tập tin cho mỗi học sinh của bạn. Hãy xem
>>> importjinja2>>> environment=jinja2.Environment()>>> template=environment.from_string("Hello, {{ name }}!")>>> template.render(name="World")'Hello, World!'
5, ví dụ:
Sử dụng nếu các câu lệnh
Trong ví dụ từ phần trước, bạn đã tạo ra các tin nhắn tùy chỉnh cho các sinh viên hàng đầu của mình. Bây giờ, thời gian để xem xét tất cả các sinh viên của bạn. Thêm hai sinh viên có điểm số thấp hơn vào
>>> importJinja2Traceback (most recent call last):...ModuleNotFoundError: No module named 'Jinja2'>>> importjinja2>>> # No error
8 trong
>>> importJinja2Traceback (most recent call last):...ModuleNotFoundError: No module named 'Jinja2'>>> importjinja2>>> # No error
Bạn thêm điểm số của Fritz và Sirius vào danh sách
>>> importJinja2Traceback (most recent call last):...ModuleNotFoundError: No module named 'Jinja2'>>> importjinja2>>> # No error
8. Không giống như các sinh viên khác, cả hai đều thực hiện dưới tám mươi điểm. Sử dụng nhãn
{# templates/message.txt #}
Hello {{ name }}!
I'm happy to inform you that you did very well on today's {{ test_name }}.
You reached {{ score }} out of {{ max_score }} points.
See you tomorrow!
Anke
2 để tạo một câu lệnh có điều kiện trong
(venv)$ python -m pip list
Package Version---------- -------Jinja2 3.x...
Ngoài các biến mà bạn đã sử dụng trước đây, bây giờ bạn cũng sử dụng một câu lệnh có điều kiện với khối jinja. Thay vì sử dụng một cặp niềng răng xoăn kép, bạn tạo các khối jinja với một nẹp xoăn và dấu phần trăm (
{# templates/message.txt #}
Hello {{ name }}!
I'm happy to inform you that you did very well on today's {{ test_name }}.
You reached {{ score }} out of {{ max_score }} points.
See you tomorrow!
Anke
4) ở mỗi đầu.block. Instead of using a pair of double curly braces, you create Jinja blocks with one curly brace and a percent sign (
{# templates/message.txt #}
Hello {{ name }}!
I'm happy to inform you that you did very well on today's {{ test_name }}.
You reached {{ score }} out of {{ max_score }} points.
See you tomorrow!
Anke
4) on each end.
Mặc dù bạn có thể nghĩ về các biến bình thường dưới dạng chuỗi con, Jinja chặn bao bọc một phần lớn hơn trong mẫu của bạn. Đó là lý do tại sao bạn cũng cần nói với Jinja nơi khối của bạn kết thúc. Để đóng một khối, bạn sử dụng lại cùng một từ khóa, với tiền tố
{# templates/message.txt #}
Hello {{ name }}!
I'm happy to inform you that you did very well on today's {{ test_name }}.
You reached {{ score }} out of {{ max_score }} points.
See you tomorrow!
Anke
5.
Trong ví dụ trên, bạn đã bắt đầu một khối
{# templates/message.txt #}
Hello {{ name }}!
I'm happy to inform you that you did very well on today's {{ test_name }}.
You reached {{ score }} out of {{ max_score }} points.
See you tomorrow!
Anke
6 trong dòng 5, bạn đóng trong dòng 9 với
{# templates/message.txt #}
Hello {{ name }}!
I'm happy to inform you that you did very well on today's {{ test_name }}.
You reached {{ score }} out of {{ max_score }} points.
See you tomorrow!
Anke
7. Bản thân tuyên bố ____77 hoạt động giống như các tuyên bố có điều kiện trong Python. Trong dòng 5, bạn có thể kiểm tra xem
>>> importJinja2Traceback (most recent call last):...ModuleNotFoundError: No module named 'Jinja2'>>> importjinja2>>> # No error
7 có cao hơn
{# templates/message.txt #}
Hello {{ name }}!
I'm happy to inform you that you did very well on today's {{ test_name }}.
You reached {{ score }} out of {{ max_score }} points.
See you tomorrow!
Anke
2 không. Nếu vậy, sau đó bạn sẽ đưa ra một tin nhắn hạnh phúc. Nếu không, bạn đưa ra một thông điệp xin lỗi trong dòng 8.
Trong ví dụ trên, các sinh viên đồng ý rằng họ muốn có tám mươi điểm là điểm chuẩn cho hiệu suất thử thách Python của họ. Hãy thay đổi
{# templates/message.txt #}
Hello {{ name }}!
I'm happy to inform you that you did very well on today's {{ test_name }}.
You reached {{ score }} out of {{ max_score }} points.
See you tomorrow!
Anke
2 thành bất kỳ điểm nào khiến bạn và học sinh thoải mái hơn.
Tận dụng cho các vòng lặp
Bạn cũng có thể kiểm soát luồng của các mẫu của bạn với các vòng
5. Ví dụ, bạn quyết định tạo một trang HTML cho các sinh viên của bạn hiển thị tất cả các kết quả. Lưu ý rằng tất cả các sinh viên đã đồng ý thể hiện kết quả của họ một cách công khai trong cuộc thi thân thiện này.
Tạo một tệp mới có tên
# write_messages.pyfromjinja2importEnvironment,FileSystemLoadermax_score=100test_name="Python Challenge"students=[{"name":"Sandrine","score":100},{"name":"Gergeley","score":87},{"name":"Frieda","score":92},]environment=Environment(loader=FileSystemLoader("templates/"))template=environment.get_template("message.txt")forstudentinstudents:filename=f"message_{student['name'].lower()}.txt"content=template.render(student,max_score=max_score,test_name=test_name)withopen(filename,mode="w",encoding="utf-8")asmessage:message.write(content)print(f"... wrote {filename}")
3 trong thư mục
(venv)$ python -m pip list
Package Version---------- -------Jinja2 3.x...
Tại đây, bạn đã tạo một trang HTML lặp qua từ điển
>>> importJinja2Traceback (most recent call last):...ModuleNotFoundError: No module named 'Jinja2'>>> importjinja2>>> # No error
8 của bạn và hiển thị hiệu suất của chúng. Giống như với các khối
{# templates/message.txt #}
Hello {{ name }}!
I'm happy to inform you that you did very well on today's {{ test_name }}.
You reached {{ score }} out of {{ max_score }} points.
See you tomorrow!
Anke
6, bạn phải đảm bảo rằng bạn đóng khối
# write_messages.pyfromjinja2importEnvironment,FileSystemLoadermax_score=100test_name="Python Challenge"students=[{"name":"Sandrine","score":100},{"name":"Gergeley","score":87},{"name":"Frieda","score":92},]environment=Environment(loader=FileSystemLoader("templates/"))template=environment.get_template("message.txt")forstudentinstudents:filename=f"message_{student['name'].lower()}.txt"content=template.render(student,max_score=max_score,test_name=test_name)withopen(filename,mode="w",encoding="utf-8")asmessage:message.write(content)print(f"... wrote {filename}")
7 của mình với
# write_messages.pyfromjinja2importEnvironment,FileSystemLoadermax_score=100test_name="Python Challenge"students=[{"name":"Sandrine","score":100},{"name":"Gergeley","score":87},{"name":"Frieda","score":92},]environment=Environment(loader=FileSystemLoader("templates/"))template=environment.get_template("message.txt")forstudentinstudents:filename=f"message_{student['name'].lower()}.txt"content=template.render(student,max_score=max_score,test_name=test_name)withopen(filename,mode="w",encoding="utf-8")asmessage:message.write(content)print(f"... wrote {filename}")
8.
Bạn có thể kết hợp các câu lệnh
>>> importjinja2>>> environment=jinja2.Environment()>>> template=environment.from_string("Hello, {{ name }}!")>>> template.render(name="World")'Hello, World!'
Tùy thuộc vào điểm số của học sinh, bạn thể hiện biểu tượng cảm xúc khuôn mặt buồn bã. Lưu ý rằng bạn cũng có thể đặt các biểu thức khối trên một dòng.
Tiếp tục và cập nhật
>>> importJinja2Traceback (most recent call last):...ModuleNotFoundError: No module named 'Jinja2'>>> importjinja2>>> # No error
5 nơi bạn đã lưu một tin nhắn cho mỗi học sinh, giờ đây bạn cũng đang viết một tệp HTML duy nhất chứa tất cả các kết quả cho học sinh đó. Lần này, bạn đã tạo ra một từ điển
Bạn có thể xem tệp HTML được kết xuất trong trình chỉnh sửa mã của bạn. Tuy nhiên, vì bạn làm việc với HTML ngay bây giờ, bạn cũng có thể xem tệp trong trình duyệt của mình:
Giống như trong các tập lệnh Python, bạn có thể kiểm soát dòng chảy của các mẫu Jinja với câu lệnh
>>> importjinja2>>> environment=jinja2.Environment()>>> template=environment.from_string("Hello, {{ name }}!")>>> template.render(name="World")'Hello, World!'
5, thì nội dung trong khối đó sẽ được hiển thị trong mỗi bước của vòng lặp.
Với các mẫu, bạn có thể tạo các khối xây dựng cho các trang web lớn hơn mà không cần sao chép mã mặt trước của bạn. Đó là lý do tại sao các khung web như Flask tận dụng sức mạnh của các mẫu Jinja. Trong phần tiếp theo, bạn sẽ học cách sử dụng bình để hiển thị dữ liệu từ phía sau vào các trang web của mặt trước.
Sử dụng Jinja với bình
Rất có thể bạn lần đầu tiên nghe nói về Jinja khi bạn sử dụng một khung web như bình. Cả Jinja và Flask đều được duy trì bởi Pallet Project, một tổ chức dựa trên cộng đồng, chăm sóc các thư viện Python cung cấp năng lượng cho khung web của Flask.
Trong phần này, bạn sẽ tiếp tục các ví dụ từ trước bằng cách tạo một ứng dụng web cơ bản cho sinh viên của bạn.
Cài đặt bình
Bạn có thể tiếp tục làm việc trong cùng một thư mục và môi trường ảo mà bạn đã tạo trong phần trước. Khi bạn ở trong môi trường ảo đang hoạt động, hãy tiếp tục và cài đặt bình:
14, bạn sẽ nhận được nhiều thông báo lỗi có ý nghĩa hơn nếu có sự cố. Ngoài ra, máy chủ của bạn sẽ tự động khởi động lại bất cứ khi nào bạn thay đổi thứ gì đó trong cơ sở mã của mình.
Tuyệt vời, bây giờ bạn có một ứng dụng Running Flask! Trong phần tiếp theo, bạn sẽ triển khai các mẫu jinja trong ứng dụng bình của mình.
Thêm một mẫu cơ sở
Cho đến nay, ứng dụng bình của bạn trả về một chuỗi. Bạn có thể nâng cao chuỗi của mình bằng cách thêm mã HTML và bình sẽ hiển thị nó cho bạn. Nhưng như bạn đã học trong phần trước, sử dụng các mẫu làm cho nội dung kết xuất thuận tiện hơn nhiều cho bạn.
26 trong tiêu đề trang web của bạn và trong tin nhắn chào mừng. Tiếp theo, bạn sẽ tạo một trang để hiển thị kết quả của học sinh.
Thêm trang khác
Trong một trong các phần trước, bạn đã sử dụng
# write_messages.pyfromjinja2importEnvironment,FileSystemLoadermax_score=100test_name="Python Challenge"students=[{"name":"Sandrine","score":100},{"name":"Gergeley","score":87},{"name":"Frieda","score":92},]environment=Environment(loader=FileSystemLoader("templates/"))template=environment.get_template("message.txt")forstudentinstudents:filename=f"message_{student['name'].lower()}.txt"content=template.render(student,max_score=max_score,test_name=test_name)withopen(filename,mode="w",encoding="utf-8")asmessage:message.write(content)print(f"... wrote {filename}")
28. Bây giờ bạn đã có một ứng dụng web, bạn có thể sử dụng
# write_messages.pyfromjinja2importEnvironment,FileSystemLoadermax_score=100test_name="Python Challenge"students=[{"name":"Sandrine","score":100},{"name":"Gergeley","score":87},{"name":"Frieda","score":92},]environment=Environment(loader=FileSystemLoader("templates/"))template=environment.get_template("message.txt")forstudentinstudents:filename=f"message_{student['name'].lower()}.txt"content=template.render(student,max_score=max_score,test_name=test_name)withopen(filename,mode="w",encoding="utf-8")asmessage:message.write(content)print(f"... wrote {filename}")
3 để hiển thị mẫu của mình một cách linh hoạt mà không lưu nó vào một tệp mới lần này.
Đảm bảo rằng
# write_messages.pyfromjinja2importEnvironment,FileSystemLoadermax_score=100test_name="Python Challenge"students=[{"name":"Sandrine","score":100},{"name":"Gergeley","score":87},{"name":"Frieda","score":92},]environment=Environment(loader=FileSystemLoader("templates/"))template=environment.get_template("message.txt")forstudentinstudents:filename=f"message_{student['name'].lower()}.txt"content=template.render(student,max_score=max_score,test_name=test_name)withopen(filename,mode="w",encoding="utf-8")asmessage:message.write(content)print(f"... wrote {filename}")
3 được đặt trong
(venv)$ python -m pip list
Package Version---------- -------Jinja2 3.x...
24 chỉ chấp nhận một đối số vị trí, đó là tên mẫu. Bất kỳ đối số khác phải là đối số từ khóa. Vì vậy, bạn phải giải nén từ điển của mình bằng hai dấu sao (
# write_messages.pyfromjinja2importEnvironment,FileSystemLoadermax_score=100test_name="Python Challenge"students=[{"name":"Sandrine","score":100},{"name":"Gergeley","score":87},{"name":"Frieda","score":92},]environment=Environment(loader=FileSystemLoader("templates/"))template=environment.get_template("message.txt")forstudentinstudents:filename=f"message_{student['name'].lower()}.txt"content=template.render(student,max_score=max_score,test_name=test_name)withopen(filename,mode="w",encoding="utf-8")asmessage:message.write(content)print(f"... wrote {filename}")
3 với bối cảnh được hiển thị. Nhảy qua trình duyệt và xem nó:
Bây giờ bạn có một trang chủ và một trang hiển thị kết quả của học sinh. Đó là một khởi đầu tuyệt vời cho một ứng dụng web!
Trong phần tiếp theo, bạn sẽ học cách tận dụng sức mạnh của các mẫu của bạn hơn nữa bằng cách làm tổ chúng. Bạn cũng sẽ thêm một menu điều hướng vào dự án của mình để người dùng có thể thuận tiện nhảy từ trang này sang trang khác.
Nest Mẫu của bạn
Khi ứng dụng của bạn phát triển và bạn tiếp tục thêm các mẫu mới, bạn phải giữ mã thông thường đồng bộ. Cho đến nay, hai mẫu của bạn,
# write_messages.pyfromjinja2importEnvironment,FileSystemLoadermax_score=100test_name="Python Challenge"students=[{"name":"Sandrine","score":100},{"name":"Gergeley","score":87},{"name":"Frieda","score":92},]environment=Environment(loader=FileSystemLoader("templates/"))template=environment.get_template("message.txt")forstudentinstudents:filename=f"message_{student['name'].lower()}.txt"content=template.render(student,max_score=max_score,test_name=test_name)withopen(filename,mode="w",encoding="utf-8")asmessage:message.write(content)print(f"... wrote {filename}")
3, trông rất giống nhau. Khi nhiều mẫu chứa cùng một mã, bạn cần điều chỉnh mọi mẫu nếu bạn thay đổi bất kỳ mã phổ biến nào.
Trong phần này, bạn sẽ thực hiện cấu trúc mẫu cha và con mà mà sẽ làm cho mã của bạn được bảo trì hơn nhiều.
Điều chỉnh mẫu cơ sở của bạn
Khi bạn sử dụng kế thừa mẫu Jinja, bạn có thể chuyển cấu trúc chung của ứng dụng web của mình sang mẫu cơ sở cha và để các mẫu con kế thừa mã đó.base template and let
child templates inherit that code.
47 để xác định phần nào của mẫu cơ sở của bạn có thể bị ghi đè bởi các mẫu con. Giống như với
{# templates/message.txt #}
Hello {{ name }}!
I'm happy to inform you that you did very well on today's {{ test_name }}.
You reached {{ score }} out of {{ max_score }} points.
See you tomorrow!
Anke
6 và
# write_messages.pyfromjinja2importEnvironment,FileSystemLoadermax_score=100test_name="Python Challenge"students=[{"name":"Sandrine","score":100},{"name":"Gergeley","score":87},{"name":"Frieda","score":92},]environment=Environment(loader=FileSystemLoader("templates/"))template=environment.get_template("message.txt")forstudentinstudents:filename=f"message_{student['name'].lower()}.txt"content=template.render(student,max_score=max_score,test_name=test_name)withopen(filename,mode="w",encoding="utf-8")asmessage:message.write(content)print(f"... wrote {filename}")
47. Cũng như các biến trong các mẫu, Jinja đã giành được khiếu nại nếu bạn không cung cấp nội dung cho chúng. Thay vào đó, Jinja sẽ hiển thị một chuỗi trống.
# write_messages.pyfromjinja2importEnvironment,FileSystemLoadermax_score=100test_name="Python Challenge"students=[{"name":"Sandrine","score":100},{"name":"Gergeley","score":87},{"name":"Frieda","score":92},]environment=Environment(loader=FileSystemLoader("templates/"))template=environment.get_template("message.txt")forstudentinstudents:filename=f"message_{student['name'].lower()}.txt"content=template.render(student,max_score=max_score,test_name=test_name)withopen(filename,mode="w",encoding="utf-8")asmessage:message.write(content)print(f"... wrote {filename}")
3 hoạt động độc lập, không có mẫu cha mẹ. Điều đó có nghĩa là bây giờ bạn có thể điều chỉnh mã của
# write_messages.pyfromjinja2importEnvironment,FileSystemLoadermax_score=100test_name="Python Challenge"students=[{"name":"Sandrine","score":100},{"name":"Gergeley","score":87},{"name":"Frieda","score":92},]environment=Environment(loader=FileSystemLoader("templates/"))template=environment.get_template("message.txt")forstudentinstudents:filename=f"message_{student['name'].lower()}.txt"content=template.render(student,max_score=max_score,test_name=test_name)withopen(filename,mode="w",encoding="utf-8")asmessage:message.write(content)print(f"... wrote {filename}")
47. Bằng cách cung cấp tên khối khối làm đối số, bạn đã kết nối các khối từ mẫu con với các khối từ mẫu cha.
Lưu ý rằng
# write_messages.pyfromjinja2importEnvironment,FileSystemLoadermax_score=100test_name="Python Challenge"students=[{"name":"Sandrine","score":100},{"name":"Gergeley","score":87},{"name":"Frieda","score":92},]environment=Environment(loader=FileSystemLoader("templates/"))template=environment.get_template("message.txt")forstudentinstudents:filename=f"message_{student['name'].lower()}.txt"content=template.render(student,max_score=max_score,test_name=test_name)withopen(filename,mode="w",encoding="utf-8")asmessage:message.write(content)print(f"... wrote {filename}")
# write_messages.pyfromjinja2importEnvironment,FileSystemLoadermax_score=100test_name="Python Challenge"students=[{"name":"Sandrine","score":100},{"name":"Gergeley","score":87},{"name":"Frieda","score":92},]environment=Environment(loader=FileSystemLoader("templates/"))template=environment.get_template("message.txt")forstudentinstudents:filename=f"message_{student['name'].lower()}.txt"content=template.render(student,max_score=max_score,test_name=test_name)withopen(filename,mode="w",encoding="utf-8")asmessage:message.write(content)print(f"... wrote {filename}")
3.
Hãy nhớ rằng bất kỳ nội dung nào bên ngoài các khối mẫu của con đã giành được xuất hiện trên trang được hiển thị của bạn. Ví dụ: nếu bạn muốn thêm điều hướng vào
# write_messages.pyfromjinja2importEnvironment,FileSystemLoadermax_score=100test_name="Python Challenge"students=[{"name":"Sandrine","score":100},{"name":"Gergeley","score":87},{"name":"Frieda","score":92},]environment=Environment(loader=FileSystemLoader("templates/"))template=environment.get_template("message.txt")forstudentinstudents:filename=f"message_{student['name'].lower()}.txt"content=template.render(student,max_score=max_score,test_name=test_name)withopen(filename,mode="w",encoding="utf-8")asmessage:message.write(content)print(f"... wrote {filename}")
3 liên kết trở lại trang chủ của bạn, thì bạn phải xác định một khối giữ chỗ mới trong
Hãy dành một chút thời gian và nghĩ về một tình huống mà một người khác chăm sóc phần cuối và trách nhiệm của bạn là mặt trước của trang web. Để tránh can thiệp vào nhau, bạn không được phép điều chỉnh bất kỳ chế độ xem nào trong
10 hoặc thay đổi dữ liệu đến trong các mẫu của bạn.
Sau một cuộc trò chuyện với các sinh viên của bạn, bạn đồng ý rằng ứng dụng web của bạn có thể được cải thiện. Bạn nghĩ ra hai tính năng:
Hiển thị các mục menu điều hướng trong chữ hoa.
Sắp xếp các sinh viên của bạn tên trong
# write_messages.pyfromjinja2importEnvironment,FileSystemLoadermax_score=100test_name="Python Challenge"students=[{"name":"Sandrine","score":100},{"name":"Gergeley","score":87},{"name":"Frieda","score":92},]environment=Environment(loader=FileSystemLoader("templates/"))template=environment.get_template("message.txt")forstudentinstudents:filename=f"message_{student['name'].lower()}.txt"content=template.render(student,max_score=max_score,test_name=test_name)withopen(filename,mode="w",encoding="utf-8")asmessage:message.write(content)print(f"... wrote {filename}")
3 theo thứ tự bảng chữ cái.
Bạn sẽ sử dụng chức năng bộ lọc Jinja, để triển khai cả hai tính năng mà không cần chạm vào phía sau.filter functionality to implement both features without touching the back end.
Sắp xếp danh sách kết quả của bạn
Hiện tại, kết quả của học sinh của bạn xuất hiện theo thứ tự giống như bạn đã định nghĩa chúng trong từ điển trong
10. Bạn có thể sử dụng bộ lọc Jinja từ ____ ____184 để sắp xếp danh sách kết quả theo thứ tự bảng chữ cái của sinh viên.
Mở
# write_messages.pyfromjinja2importEnvironment,FileSystemLoadermax_score=100test_name="Python Challenge"students=[{"name":"Sandrine","score":100},{"name":"Gergeley","score":87},{"name":"Frieda","score":92},]environment=Environment(loader=FileSystemLoader("templates/"))template=environment.get_template("message.txt")forstudentinstudents:filename=f"message_{student['name'].lower()}.txt"content=template.render(student,max_score=max_score,test_name=test_name)withopen(filename,mode="w",encoding="utf-8")asmessage:message.write(content)print(f"... wrote {filename}")
>>> importJinja2Traceback (most recent call last):...ModuleNotFoundError: No module named 'Jinja2'>>> importjinja2>>> # No error
8 của bạn có thể sử dụng được trong
# write_messages.pyfromjinja2importEnvironment,FileSystemLoadermax_score=100test_name="Python Challenge"students=[{"name":"Sandrine","score":100},{"name":"Gergeley","score":87},{"name":"Frieda","score":92},]environment=Environment(loader=FileSystemLoader("templates/"))template=environment.get_template("message.txt")forstudentinstudents:filename=f"message_{student['name'].lower()}.txt"content=template.render(student,max_score=max_score,test_name=test_name)withopen(filename,mode="w",encoding="utf-8")asmessage:message.write(content)print(f"... wrote {filename}")
Đầu tiên, bạn sắp xếp học sinh của bạn theo tên. Nếu có hai sinh viên có cùng tên, thì bạn sắp xếp chúng theo điểm số của họ. Tất nhiên, các sinh viên có cùng tên sẽ thực sự cần một số khác biệt ngoài điểm số của họ, nhưng với mục đích của ví dụ, việc sắp xếp này là đủ.
Bạn đảo ngược thứ tự của
>>> importJinja2Traceback (most recent call last):...ModuleNotFoundError: No module named 'Jinja2'>>> importjinja2>>> # No error
7 để sắp xếp những sinh viên này từ điểm cao nhất đến thấp nhất. Khi các dòng của bạn quá dài, Jinja cho phép bạn phân phối các câu lệnh của mình trên nhiều dòng.
Bạn sử dụng các bộ lọc để chuyển đổi dữ liệu trong các mẫu của bạn một cách độc lập với mặt sau của bạn. Khi áp dụng bộ lọc vào một biến, bạn có thể thay đổi giá trị biến của người dùng mà không thay đổi bất kỳ cấu trúc dữ liệu cơ bản nào.
Kiểm tra tài liệu bộ lọc Jinja, để tìm hiểu thêm về các bộ lọc mẫu.
Nếu bạn muốn đặt nhiều logic hơn vào các mẫu của mình, thì bạn có thể tận dụng các macro. Trong phần tiếp theo, bạn sẽ khám phá macro bằng cách triển khai thêm ba tính năng trong ứng dụng bình của mình.
Bao gồm các macro
Khi bạn bao gồm các mẫu một phần như menu điều hướng, mã đi kèm được hiển thị trong bối cảnh của mẫu cha mà không cần bất kỳ điều chỉnh nào. Rất thường xuyên, đó chính xác là những gì bạn muốn, nhưng những lần khác bạn có thể muốn tùy chỉnh sự xuất hiện của các mẫu được bao gồm của bạn.
Macro Jinja có thể giúp bạn tạo các phần mẫu chấp nhận các đối số. Giống như khi xác định các chức năng của riêng bạn trong Python, bạn có thể xác định các macro và nhập chúng vào các mẫu của bạn.macros can help you create template partials that accept arguments. Like when defining your own functions in Python, you can define macros and import them into your templates.
Trong phần này, bạn sẽ thêm ba tính năng nữa vào dự án bình của mình:
Thực hiện một chế độ tối.
Làm nổi bật học sinh với số điểm tốt nhất.
Đánh dấu trang hiện tại trong menu điều hướng.
Giống như trước đây, bạn đã thắng Touch Touch bất kỳ mã back-end nào để cải thiện ứng dụng web của bạn.
Thực hiện chế độ tối
Đối với một số sinh viên, một bảng màu sáng trên sáng là hấp dẫn hơn về mặt trực quan. Để phục vụ cho tất cả các sinh viên của bạn, bạn sẽ thêm tùy chọn để chuyển sang chế độ tối với văn bản màu sáng trên nền tối.
10 và sau đó tải lại trang. Bởi vì các macro chấp nhận các đối số, họ cung cấp cho bạn sự linh hoạt để hiển thị các phần có điều kiện trong các mẫu của bạn.
Làm nổi bật học sinh giỏi nhất của bạn
Một lý do khác để giới thiệu macro cho dự án bình của bạn là đưa một số logic vào ngăn riêng của nó. Giống như các mẫu làm tổ, chức năng gia công cho một macro có thể dọn dẹp mẫu cha mẹ của bạn.
Để làm nổi bật học sinh tốt nhất của bạn với biểu tượng cảm xúc ngôi sao, hãy dọn dẹp
# write_messages.pyfromjinja2importEnvironment,FileSystemLoadermax_score=100test_name="Python Challenge"students=[{"name":"Sandrine","score":100},{"name":"Gergeley","score":87},{"name":"Frieda","score":92},]environment=Environment(loader=FileSystemLoader("templates/"))template=environment.get_template("message.txt")forstudentinstudents:filename=f"message_{student['name'].lower()}.txt"content=template.render(student,max_score=max_score,test_name=test_name)withopen(filename,mode="w",encoding="utf-8")asmessage:message.write(content)print(f"... wrote {filename}")
# write_messages.pyfromjinja2importEnvironment,FileSystemLoadermax_score=100test_name="Python Challenge"students=[{"name":"Sandrine","score":100},{"name":"Gergeley","score":87},{"name":"Frieda","score":92},]environment=Environment(loader=FileSystemLoader("templates/"))template=environment.get_template("message.txt")forstudentinstudents:filename=f"message_{student['name'].lower()}.txt"content=template.render(student,max_score=max_score,test_name=test_name)withopen(filename,mode="w",encoding="utf-8")asmessage:message.write(content)print(f"... wrote {filename}")
17, nơi bạn đã nhập tất cả các macro. Vì vậy, không cần phải nhập chúng một lần nữa ở đây.
Thay vì thêm nhiều mã hơn vào mục danh sách trong
# write_messages.pyfromjinja2importEnvironment,FileSystemLoadermax_score=100test_name="Python Challenge"students=[{"name":"Sandrine","score":100},{"name":"Gergeley","score":87},{"name":"Frieda","score":92},]environment=Environment(loader=FileSystemLoader("templates/"))template=environment.get_template("message.txt")forstudentinstudents:filename=f"message_{student['name'].lower()}.txt"content=template.render(student,max_score=max_score,test_name=test_name)withopen(filename,mode="w",encoding="utf-8")asmessage:message.write(content)print(f"... wrote {filename}")
>>> importjinja2>>> environment=jinja2.Environment()>>> template=environment.from_string("Hello, {{ name }}!")>>> template.render(name="World")'Hello, World!'
7 ____ ____2224 hiển thị một biểu tượng cảm xúc trên khuôn mặt vui vẻ hoặc buồn bã. Mã này sẽ hoàn toàn phù hợp với mục đích Macro Macro là thêm một huy hiệu cho tất cả học sinh.
>>> importJinja2Traceback (most recent call last):...ModuleNotFoundError: No module named 'Jinja2'>>> importjinja2>>> # No error
8 hoàn chỉnh
Nếu bạn đã truy cập trang của mình ngay bây giờ, bạn sẽ gặp lỗi vì Flask có thể tìm thấy macro mà bạn tham khảo. Tiếp tục và thêm macro mới của bạn vào
Ngoài biểu tượng cảm xúc khuôn mặt tươi cười hoặc buồn bã mà bạn đã thể hiện trước đây, giờ đây bạn hiển thị một biểu tượng cảm xúc ngôi sao cho học sinh biểu diễn tốt nhất của bạn.
Đánh dấu trang hiện tại
Tính năng cuối cùng mà bạn sẽ triển khai sẽ cải thiện menu điều hướng của bạn. Hiện tại, menu điều hướng vẫn giữ nguyên trên một trong hai trang. Trong phần này, bạn sẽ tạo một macro đánh dấu mục menu của trang hiện tại của bạn bằng một mũi tên.
16 và xem tất cả các tính năng mà bạn đã triển khai:
Macro là một tính năng mạnh mẽ của Jinja. Tuy nhiên, bạn không nên lạm dụng chúng. Trong một số tình huống, có thể tốt hơn là đưa logic vào mặt sau thay vì để các mẫu của bạn thực hiện công việc.
Sẽ luôn có các trường hợp cạnh mà bạn phải quyết định xem bạn có thêm mã trực tiếp vào mẫu của mình không, trì hoãn nó vào một mẫu đi kèm hoặc tạo một macro thay thế. Nếu mã mẫu của bạn vật lộn quá nhiều với các cấu trúc dữ liệu của bạn, thì nó thậm chí có thể là một dấu hiệu cho thấy logic mã của bạn thuộc về phần cuối của ứng dụng của bạn.
Sự kết luận
Jinja là một công cụ tạo khuôn mẫu giàu tính năng được đóng gói với khung web Flask. Nhưng bạn cũng có thể sử dụng Jinja độc lập với bình để tạo các mẫu mà bạn có thể lập trình điền vào nội dung.
Sửa đổi các biến trong Jinja với các bộ lọcfilters
Sử dụng macro để thêm chức năng vào mặt trước của bạnmacros to add functionality to your front end
Nếu bạn muốn đưa kiến thức mới có được của mình về Jinja vào hành động, thì bạn có thể xây dựng một mặt trước cho một bộ rút ngắn URL Fastapi hoặc triển khai ứng dụng bình của bạn cho Heroku.
Bạn cũng có thể xem xét sử dụng Jinja làm công cụ mẫu cho Django. Để tìm hiểu thêm về sự khác biệt giữa công cụ tạo khuôn mẫu của Jinja và Django, hãy truy cập tài liệu của Jinja, về việc chuyển đổi từ các động cơ mẫu khác sang Jinja.
Bạn có trường hợp sử dụng khác mà bạn tận dụng các khả năng mà Jinja cung cấp không? Chia sẻ chúng với cộng đồng Python thực sự trong các ý kiến dưới đây!