Hướng dẫn display latex in python - hiển thị cao su trong trăn

Tạo các công thức toán học trong gấu trúc.

Show
a = r'\frac{a}{b}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")

Hướng dẫn display latex in python - hiển thị cao su trong trăn

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")

Hướng dẫn display latex in python - hiển thị cao su trong trăn

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.

Trong hướng dẫn này, bạn sẽ học cách:

  • Cài đặt động cơ mẫu Jinjatemplate engine
  • Tạo mẫu Jinja đầu tiên của bạntemplate
  • Hiển thị một mẫu jinja trong bìnhFlask
  • Sử dụng các vòng
    $ python3 -m venv venv
    $ source venv/bin/activate
    (venv) $
    
    5 và các câu lệnh có điều kiện với Jinja
    $ python3 -m venv venv
    $ source venv/bin/activate
    (venv) $
    
    5 loops
    and conditional statements with Jinja
  • Nest Jinja Mẫu Jinja templates
  • 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:

  • các cửa sổ
  • Linux + MacOS

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>

$ python3 -m venv venv
$ source venv/bin/activate
(venv) $

Với các lệnh trên, bạn tạo và kích hoạt môi trường ảo có tên

$ python3 -m venv venv
$ source venv/bin/activate
(venv) $
6 bằng cách sử dụng mô-đun
$ python3 -m venv venv
$ source venv/bin/activate
(venv) $
6 tích hợp Python. Điểm số (
$ python3 -m venv venv
$ source venv/bin/activate
(venv) $
8) xung quanh
$ python3 -m venv venv
$ source venv/bin/activate
(venv) $
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:

>>>

>>> import Jinja2
Traceback (most recent call last):
  ...
ModuleNotFoundError: No module named 'Jinja2'

>>> import jinja2
>>> # 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:

>>>

>>> import jinja2
>>> 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

  1. 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).
  2. 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.py

from jinja2 import Environment, FileSystemLoader

max_score = 100
test_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")

for student in students:
    filename = f"message_{student['name'].lower()}.txt"
    content = template.render(
        student,
        max_score=max_score,
        test_name=test_name
    )
    with open(filename, mode="w", encoding="utf-8") as message:
        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

>>> import Jinja2
Traceback (most recent call last):
  ...
ModuleNotFoundError: No module named 'Jinja2'

>>> import jinja2
>>> # No error
2:

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
0

Khi bạn tạo môi trường Jinja với

>>> import Jinja2
Traceback (most recent call last):
  ...
ModuleNotFoundError: No module named 'Jinja2'

>>> import jinja2
>>> # No error
3, bạn có thể chuyển đường dẫn chỉ vào thư mục mẫu của bạn. Thay vì chuyển trong một chuỗi, bây giờ bạn tải
(venv) $ python -m pip list
Package    Version
---------- -------
Jinja2     3.x
...
8 làm mẫu của bạn. Khi mẫu của bạn được tải, bạn có thể sử dụng nhiều lần để điền vào nó bằng nội dung. Trong
>>> import Jinja2
Traceback (most recent call last):
  ...
ModuleNotFoundError: No module named 'Jinja2'

>>> import jinja2
>>> # No error
2, bạn kết xuất
>>> import Jinja2
Traceback (most recent call last):
  ...
ModuleNotFoundError: No module named 'Jinja2'

>>> import jinja2
>>> # No error
6 và
>>> import Jinja2
Traceback (most recent call last):
  ...
ModuleNotFoundError: No module named 'Jinja2'

>>> import jinja2
>>> # No error
7 cho mỗi học sinh hàng đầu của bạn thành một tệp văn bản.

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
1

Lưu ý rằng các khóa của từ điển

>>> import Jinja2
Traceback (most recent call last):
  ...
ModuleNotFoundError: No module named 'Jinja2'

>>> import jinja2
>>> # No error
8, cùng với
>>> import Jinja2
Traceback (most recent call last):
  ...
ModuleNotFoundError: No module named 'Jinja2'

>>> import jinja2
>>> # No error
9 và
>>> import jinja2
>>> 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

>>> import jinja2
>>> 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

>>> import Jinja2
Traceback (most recent call last):
  ...
ModuleNotFoundError: No module named 'Jinja2'

>>> import jinja2
>>> # No error
8 trong
>>> import Jinja2
Traceback (most recent call last):
  ...
ModuleNotFoundError: No module named 'Jinja2'

>>> import jinja2
>>> # No error
2:

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
2

Bạn thêm điểm số của Fritz và Sirius vào danh sách

>>> import Jinja2
Traceback (most recent call last):
  ...
ModuleNotFoundError: No module named 'Jinja2'

>>> import jinja2
>>> # 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
...
8:

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
3

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
>>> import Jinja2
Traceback (most recent call last):
  ...
ModuleNotFoundError: No module named 'Jinja2'

>>> import jinja2
>>> # 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

$ python3 -m venv venv
$ source venv/bin/activate
(venv) $
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.py

from jinja2 import Environment, FileSystemLoader

max_score = 100
test_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")

for student in students:
    filename = f"message_{student['name'].lower()}.txt"
    content = template.render(
        student,
        max_score=max_score,
        test_name=test_name
    )
    with open(filename, mode="w", encoding="utf-8") as message:
        message.write(content)
        print(f"... wrote {filename}")
3 trong thư mục
(venv) $ python -m pip list
Package    Version
---------- -------
Jinja2     3.x
...
6 của bạn:

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
4

Tại đây, bạn đã tạo một trang HTML lặp qua từ điển

>>> import Jinja2
Traceback (most recent call last):
  ...
ModuleNotFoundError: No module named 'Jinja2'

>>> import jinja2
>>> # 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.py

from jinja2 import Environment, FileSystemLoader

max_score = 100
test_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")

for student in students:
    filename = f"message_{student['name'].lower()}.txt"
    content = template.render(
        student,
        max_score=max_score,
        test_name=test_name
    )
    with open(filename, mode="w", encoding="utf-8") as message:
        message.write(content)
        print(f"... wrote {filename}")
7 của mình với
# write_messages.py

from jinja2 import Environment, FileSystemLoader

max_score = 100
test_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")

for student in students:
    filename = f"message_{student['name'].lower()}.txt"
    content = template.render(
        student,
        max_score=max_score,
        test_name=test_name
    )
    with open(filename, mode="w", encoding="utf-8") as message:
        message.write(content)
        print(f"... wrote {filename}")
8.

Bạn có thể kết hợp các câu lệnh

>>> import jinja2
>>> environment = jinja2.Environment()
>>> template = environment.from_string("Hello, {{ name }}!")
>>> template.render(name="World")
'Hello, World!'
7 và các vòng
$ python3 -m venv venv
$ source venv/bin/activate
(venv) $
5 để kiểm soát luồng của các mẫu của bạn hơn nữa:

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
5

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

>>> import Jinja2
Traceback (most recent call last):
  ...
ModuleNotFoundError: No module named 'Jinja2'

>>> import jinja2
>>> # No error
2:

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
6

Ngoài vòng lặp

$ python3 -m venv venv
$ source venv/bin/activate
(venv) $
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
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
03 chứa tất cả các biến mà bạn chuyển vào mẫu.

Với một từ điển chứa tất cả bối cảnh mẫu của bạn, bạn có thể gọi

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
04 với
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
03 là đối số duy nhất. Khi bạn chạy
>>> import Jinja2
Traceback (most recent call last):
  ...
ModuleNotFoundError: No module named 'Jinja2'

>>> import jinja2
>>> # No error
2, bạn cũng tạo một tệp HTML:

>>>

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
7

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:

Hướng dẫn display latex in python - hiển thị cao su trong trăn

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

>>> import jinja2
>>> environment = jinja2.Environment()
>>> template = environment.from_string("Hello, {{ name }}!")
>>> template.render(name="World")
'Hello, World!'
7 và các vòng
$ python3 -m venv venv
$ source venv/bin/activate
(venv) $
5. Ở Jinja, bạn đã sử dụng các khối để bọc nội dung. Khi bạn sử dụng khối
$ python3 -m venv venv
$ source venv/bin/activate
(venv) $
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:

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
8

Với Flask được cài đặt, tiếp tục tạo tuyến đường đầu tiên của bạn để xác minh rằng Flask hoạt động như mong đợi. Tạo một tệp có tên

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
10 trong thư mục gốc dự án của bạn:

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
9

Khi bạn đặt một bộ trang trí

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
11 lên trên hàm xem bình, bạn đăng ký nó với quy tắc URL đã cho. Tại đây, bạn đã thiết lập tuyến đường
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
12, trả về
(venv) $ python -m pip list
Package    Version
---------- -------
Jinja2     3.x
...
5.view function, you register it with the given URL rule. Here, you’re establishing the route
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
12, which returns
(venv) $ python -m pip list
Package    Version
---------- -------
Jinja2     3.x
...
5.

Để xem trang chủ của bạn trong trình duyệt, hãy khởi động máy chủ web phát triển Flask của bạn:

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
0

Bây giờ ứng dụng bình của bạn đang chạy ở chế độ

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
14. Trong chế độ
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
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.

Để xem trang chủ của bạn, hãy truy cập

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
16:

Hướng dẫn display latex in python - hiển thị cao su trong trăn

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.

Tạo một mẫu mới có tên

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
17 trong thư mục
(venv) $ python -m pip list
Package    Version
---------- -------
Jinja2     3.x
...
6 của bạn:

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
1

Trong

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
17, bạn có hai lần xuất hiện trong đó bạn sử dụng các biến mẫu: Một lần trong dòng 7 và sau đó một lần nữa trong dòng 11. Để kết xuất và phục vụ
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
17, hãy tải nó làm trang chủ của bạn trong
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
10:

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
2

Theo mặc định, Flask mong đợi các mẫu của bạn trong thư mục

(venv) $ python -m pip list
Package    Version
---------- -------
Jinja2     3.x
...
6. Do đó, bạn không cần phải đặt thư mục mẫu một cách rõ ràng. Khi bạn cung cấp
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
17 đến
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
24, Flask biết nơi để tìm mẫu của bạn.

Khởi động lại máy chủ phát triển Flask của bạn nếu nó đã được cập nhật tự động. Sau đó truy cập

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
16 và xác minh rằng Flask phục vụ và hiển thị mẫu cơ sở của bạn:

Hướng dẫn display latex in python - hiển thị cao su trong trăn

Flask đã hiển thị biến

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
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.py

from jinja2 import Environment, FileSystemLoader

max_score = 100
test_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")

for student in students:
    filename = f"message_{student['name'].lower()}.txt"
    content = template.render(
        student,
        max_score=max_score,
        test_name=test_name
    )
    with open(filename, mode="w", encoding="utf-8") as message:
        message.write(content)
        print(f"... wrote {filename}")
3 làm mẫu để tạo tệp có tên
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
28. Bây giờ bạn đã có một ứng dụng web, bạn có thể sử dụng
# write_messages.py

from jinja2 import Environment, FileSystemLoader

max_score = 100
test_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")

for student in students:
    filename = f"message_{student['name'].lower()}.txt"
    content = template.render(
        student,
        max_score=max_score,
        test_name=test_name
    )
    with open(filename, mode="w", encoding="utf-8") as message:
        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.py

from jinja2 import Environment, FileSystemLoader

max_score = 100
test_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")

for student in students:
    filename = f"message_{student['name'].lower()}.txt"
    content = template.render(
        student,
        max_score=max_score,
        test_name=test_name
    )
    with open(filename, mode="w", encoding="utf-8") as message:
        message.write(content)
        print(f"... wrote {filename}")
3 được đặt trong
(venv) $ python -m pip list
Package    Version
---------- -------
Jinja2     3.x
...
6 và trông như thế này:

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
3

Các điều chỉnh duy nhất cho phiên bản trước được tô sáng ở trên:

  • Dòng 7 thêm một tiêu đề trang động. adds a dynamic page title.
  • Dòng 11 tăng cường tiêu đề đầu tiên. enhances the first headline.

Để truy cập trang kết quả trong ứng dụng web của bạn, bạn phải tạo một tuyến đường. Thêm mã sau vào

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
10:

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
4

Trong một ứng dụng web chính thức, bạn có thể lưu trữ dữ liệu trong cơ sở dữ liệu bên ngoài. Hiện tại, bạn giữ

>>> import Jinja2
Traceback (most recent call last):
  ...
ModuleNotFoundError: No module named 'Jinja2'

>>> import jinja2
>>> # No error
9,
>>> import jinja2
>>> environment = jinja2.Environment()
>>> template = environment.from_string("Hello, {{ name }}!")
>>> template.render(name="World")
'Hello, World!'
0 và
>>> import Jinja2
Traceback (most recent call last):
  ...
ModuleNotFoundError: No module named 'Jinja2'

>>> import jinja2
>>> # No error
8 bên cạnh
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
36.

Flask từ

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
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 (
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
38) trước
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
03. Với các toán tử Asterisk, bạn đã chuyển các mục của
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
03 làm đối số từ khóa thành
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
24.

Khi bạn truy cập

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
42 trong trình duyệt của mình, Flask phục vụ
# write_messages.py

from jinja2 import Environment, FileSystemLoader

max_score = 100
test_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")

for student in students:
    filename = f"message_{student['name'].lower()}.txt"
    content = template.render(
        student,
        max_score=max_score,
        test_name=test_name
    )
    with open(filename, mode="w", encoding="utf-8") as message:
        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ó:

Hướng dẫn display latex in python - hiển thị cao su trong tră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,

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
17 và
# write_messages.py

from jinja2 import Environment, FileSystemLoader

max_score = 100
test_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")

for student in students:
    filename = f"message_{student['name'].lower()}.txt"
    content = template.render(
        student,
        max_score=max_score,
        test_name=test_name
    )
    with open(filename, mode="w", encoding="utf-8") as message:
        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.

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
17 của bạn gần như đã sẵn sàng để làm mẫu cơ sở của bạn. Để làm cho mẫu cơ sở của bạn có thể mở rộng, hãy thêm một số thẻ
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
47 vào cấu trúc:

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
5

Bạn sử dụng thẻ

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
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.py

from jinja2 import Environment, FileSystemLoader

max_score = 100
test_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")

for student in students:
    filename = f"message_{student['name'].lower()}.txt"
    content = template.render(
        student,
        max_score=max_score,
        test_name=test_name
    )
    with open(filename, mode="w", encoding="utf-8") as message:
        message.write(content)
        print(f"... wrote {filename}")
7, bạn phải đóng các khối của mình bằng
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
51.

Lưu ý rằng bạn cũng đặt tên cho các khối của bạn. Với đối số

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
26, bạn cho phép một mẫu con thay thế mã giữa
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
53 và
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
54 bằng khối
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
26 riêng. Bạn có thể thay thế mã của
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
56 bằng khối
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
57.

Nội dung mà bạn có ở giữa các thẻ

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
47 trong
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
17 là một trình giữ chỗ. Nội dung dự phòng hiển thị bất cứ khi nào một mẫu con không chứa các thẻ
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
47 tương ứng.

Bạn cũng có thể quyết định không thêm nội dung dự phòng giữa các thẻ

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
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.

Trong

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
17, bạn cung cấp nội dung dự phòng cho các khối mẫu của mình. Do đó, bạn không cần phải thay đổi bất cứ điều gì trong chế độ xem
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
63 của bạn. Nó sẽ hoạt động giống như trước đây.

Trong phần tiếp theo, bạn sẽ chuẩn bị mẫu cho con mình để làm việc với

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
17.

Mở rộng các mẫu trẻ em

Bạn hiện có một mẫu

# write_messages.py

from jinja2 import Environment, FileSystemLoader

max_score = 100
test_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")

for student in students:
    filename = f"message_{student['name'].lower()}.txt"
    content = template.render(
        student,
        max_score=max_score,
        test_name=test_name
    )
    with open(filename, mode="w", encoding="utf-8") as message:
        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.py

from jinja2 import Environment, FileSystemLoader

max_score = 100
test_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")

for student in students:
    filename = f"message_{student['name'].lower()}.txt"
    content = template.render(
        student,
        max_score=max_score,
        test_name=test_name
    )
    with open(filename, mode="w", encoding="utf-8") as message:
        message.write(content)
        print(f"... wrote {filename}")
3 để kết nối nó với
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
17:

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
6

Để kết nối mẫu con với mẫu cha mẹ của nó, bạn phải thêm thẻ

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
68 ở đầu tệp.

Các mẫu con cũng chứa các thẻ

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
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.py

from jinja2 import Environment, FileSystemLoader

max_score = 100
test_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")

for student in students:
    filename = f"message_{student['name'].lower()}.txt"
    content = template.render(
        student,
        max_score=max_score,
        test_name=test_name
    )
    with open(filename, mode="w", encoding="utf-8") as message:
        message.write(content)
        print(f"... wrote {filename}")
3 không chứa một khối
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
26. Nhưng trang của bạn vẫn sẽ hiển thị đúng tiêu đề, bởi vì nó sử dụng nội dung dự phòng trong
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
17 và chế độ xem cung cấp biến
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
26.

Bạn không cần phải điều chỉnh chế độ xem

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
36 của bạn. Khi bạn truy cập
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
42, bạn sẽ không nhận thấy thay đổi. Trang được kết xuất chứa mã gốc của
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
17 và các phần điền từ khối
# write_messages.py

from jinja2 import Environment, FileSystemLoader

max_score = 100
test_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")

for student in students:
    filename = f"message_{student['name'].lower()}.txt"
    content = template.render(
        student,
        max_score=max_score,
        test_name=test_name
    )
    with open(filename, mode="w", encoding="utf-8") as message:
        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.py

from jinja2 import Environment, FileSystemLoader

max_score = 100
test_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")

for student in students:
    filename = f"message_{student['name'].lower()}.txt"
    content = template.render(
        student,
        max_score=max_score,
        test_name=test_name
    )
    with open(filename, mode="w", encoding="utf-8") as message:
        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
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
17 hoặc thêm menu điều hướng vào cấu trúc của
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
17.

Áp dụng các bộ lọc

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

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
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:

  1. Hiển thị các mục menu điều hướng trong chữ hoa.
  2. Sắp xếp các sinh viên của bạn tên trong
    # write_messages.py
    
    from jinja2 import Environment, FileSystemLoader
    
    max_score = 100
    test_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")
    
    for student in students:
        filename = f"message_{student['name'].lower()}.txt"
        content = template.render(
            student,
            max_score=max_score,
            test_name=test_name
        )
        with open(filename, mode="w", encoding="utf-8") as message:
            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

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
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.py

from jinja2 import Environment, FileSystemLoader

max_score = 100
test_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")

for student in students:
    filename = f"message_{student['name'].lower()}.txt"
    content = template.render(
        student,
        max_score=max_score,
        test_name=test_name
    )
    with open(filename, mode="w", encoding="utf-8") as message:
        message.write(content)
        print(f"... wrote {filename}")
3 và thêm bộ lọc
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
84 vào vòng lặp
$ python3 -m venv venv
$ source venv/bin/activate
(venv) $
5 của bạn:

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
7

Bộ lọc

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
84 sử dụng Python từ
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
89 dưới mui xe.

>>> import Jinja2
Traceback (most recent call last):
  ...
ModuleNotFoundError: No module named 'Jinja2'

>>> import jinja2
>>> # No error
8 của bạn có thể sử dụng được trong
# write_messages.py

from jinja2 import Environment, FileSystemLoader

max_score = 100
test_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")

for student in students:
    filename = f"message_{student['name'].lower()}.txt"
    content = template.render(
        student,
        max_score=max_score,
        test_name=test_name
    )
    with open(filename, mode="w", encoding="utf-8") as message:
        message.write(content)
        print(f"... wrote {filename}")
3 chứa một từ điển cho mỗi mục. Bằng cách thêm
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
92, bạn nói với Jinja sắp xếp
>>> import Jinja2
Traceback (most recent call last):
  ...
ModuleNotFoundError: No module named 'Jinja2'

>>> import jinja2
>>> # No error
8 dựa trên các giá trị của
>>> import Jinja2
Traceback (most recent call last):
  ...
ModuleNotFoundError: No module named 'Jinja2'

>>> import jinja2
>>> # No error
6. Bạn có thể sử dụng bộ lọc
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
84 mà không có bất kỳ đối số nào khi bạn muốn sắp xếp danh sách các chuỗi.

Truy cập

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
42 và kiểm tra phân loại mới:

Hướng dẫn display latex in python - hiển thị cao su trong trăn

Bạn đã sử dụng bộ lọc Jinja từ

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
84 để sắp xếp kết quả của học sinh của bạn bằng tên của họ. Nếu bạn có học sinh có cùng tên, thì bạn có thể xâu chuỗi các bộ lọc:

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
8

Đầ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

>>> import Jinja2
Traceback (most recent call last):
  ...
ModuleNotFoundError: No module named 'Jinja2'

>>> import jinja2
>>> # 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:

  1. Thực hiện một chế độ tối.
  2. Làm nổi bật học sinh với số điểm tốt nhất.
  3. Đá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.

Thêm tệp

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
99 vào thư mục
(venv) $ python -m pip list
Package    Version
---------- -------
Jinja2     3.x
...
6:

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
9

Bạn xác định một macro với khối

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
01 giống như định nghĩa hàm trong Python. Macro của bạn phải có một tên và nó có thể chấp nhận các đối số.

Đối với macro

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
02, bạn phải cung cấp tên phần tử HTML. Đây sẽ là yếu tố mà CSS trong dòng 6 đến 14 thay đổi từ ánh sáng sang tối.

Để tránh phục vụ một trang web theo chủ đề tối theo mặc định, bạn muốn cung cấp cho sinh viên của mình tùy chọn để chuyển đổi thiết kế. Khi họ thêm

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
03 vào bất kỳ tuyến đường nào trong ứng dụng của bạn, bạn sẽ kích hoạt chế độ tối.

Trong dòng 4, bạn đã sử dụng đối tượng Flask Flask

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
04 để đọc các tham số yêu cầu. Đối tượng
PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
04 có mặt trong bối cảnh mẫu của bạn theo mặc định.

Nếu tham số Chế độ tối tồn tại trong một yêu cầu GET, thì bạn sẽ hiển thị một liên kết với tùy chọn chuyển sang chế độ Light trong dòng 5 và thêm thẻ

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
06 vào mẫu. Không có bất kỳ tham số chế độ tối nào, bạn hiển thị một liên kết chuyển sang chủ đề tối.

Để sử dụng macro của bạn, bạn phải nhập chúng vào mẫu cơ sở của bạn. Giống như với các câu lệnh Python từ

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
07, nó đã khuyến nghị đặt khối
PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
08 ở đầu mẫu của bạn:

$ python3 -m venv venv
$ source venv/bin/activate
(venv) $
0

Tùy thuộc vào các tham số GET của yêu cầu, bạn hiển thị chế độ tối và hiển thị liên kết để chuyển sang chủ đề màu khác.

Bằng cách cung cấp

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
09 làm đối số cho
PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
10, học sinh của bạn có thể chuyển bảng màu của toàn bộ trang. Truy cập
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
16 và chơi xung quanh với bảng màu của bạn chuyển đổi:

Bạn có thể thử cung cấp

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
12 thay vì
PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
13 đến
PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
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.py

from jinja2 import Environment, FileSystemLoader

max_score = 100
test_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")

for student in students:
    filename = f"message_{student['name'].lower()}.txt"
    content = template.render(
        student,
        max_score=max_score,
        test_name=test_name
    )
    with open(filename, mode="w", encoding="utf-8") as message:
        message.write(content)
        print(f"... wrote {filename}")
3 và tham khảo một macro
PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
16:

$ python3 -m venv venv
$ source venv/bin/activate
(venv) $
1

Lưu ý rằng bạn không nhập khẩu

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
99 ở đầu
# write_messages.py

from jinja2 import Environment, FileSystemLoader

max_score = 100
test_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")

for student in students:
    filename = f"message_{student['name'].lower()}.txt"
    content = template.render(
        student,
        max_score=max_score,
        test_name=test_name
    )
    with open(filename, mode="w", encoding="utf-8") as message:
        message.write(content)
        print(f"... wrote {filename}")
3. Bạn có thể mở rộng
a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
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.py

from jinja2 import Environment, FileSystemLoader

max_score = 100
test_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")

for student in students:
    filename = f"message_{student['name'].lower()}.txt"
    content = template.render(
        student,
        max_score=max_score,
        test_name=test_name
    )
    with open(filename, mode="w", encoding="utf-8") as message:
        message.write(content)
        print(f"... wrote {filename}")
3, bạn đã tham khảo
PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
21 bên trong vòng lặp
$ python3 -m venv venv
$ source venv/bin/activate
(venv) $
5 của bạn. Bạn có cơ hội loại bỏ điều kiện
>>> import jinja2
>>> 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.

Macro

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
16 sẽ mong đợi hai đối số:

  1. Từ điển
    PS> python -m venv venv
    PS> .\venv\Scripts\activate
    (venv) PS>
    
    26 hiện tại
  2. Danh sách
    >>> import Jinja2
    Traceback (most recent call last):
      ...
    ModuleNotFoundError: No module named 'Jinja2'
    
    >>> import jinja2
    >>> # 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

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
99:

$ python3 -m venv venv
$ source venv/bin/activate
(venv) $
2

Jinja cho phép bạn xác định các biến của riêng bạn bên trong một mẫu với khối

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
29. Khi bạn xác định các biến, bạn cũng có thể thêm các bộ lọc vào giá trị của chúng và thậm chí chuỗi chúng.

Trong

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
30, bạn đã xác định
PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
31 bằng cách trước tiên tạo danh sách tất cả các điểm số với bộ lọc
PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
32 và sau đó chọn điểm cao nhất với
PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
33. Cả hai bộ lọc đều hoạt động tương tự như chức năng Python từ ____232 hoặc
PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
33.

Khi bạn biết điểm số cao nhất trong số các học sinh của mình, thì bạn sẽ kiểm tra điểm của học sinh hiện tại của bạn so với nó trong dòng 8 đến 14.

Truy cập

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
42 và xem Macro mới của bạn hoạt động:

Hướng dẫn display latex in python - hiển thị cao su trong trăn

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.

Thêm một vĩ mô khác vào

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
99:

$ python3 -m venv venv
$ source venv/bin/activate
(venv) $
3

Macro

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
38 của bạn lấy mục menu làm đối số. Nếu
PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
39 khớp với điểm cuối hiện tại, thì macro của bạn sẽ hiển thị một mũi tên ngoài liên kết mục menu.

Ngoài ra, bạn kiểm tra chế độ màu. Nếu

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
40 là một phần của yêu cầu GET, thì
PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
41 sẽ được thêm vào liên kết menu. Không kiểm tra và thêm chế độ, bạn sẽ chuyển sang chủ đề ánh sáng mỗi khi bạn nhấp vào liên kết, vì
PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
41 sẽ là một phần của liên kết.

Thay thế liên kết mục menu trong

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
43 bằng macro mới của bạn:

$ python3 -m venv venv
$ source venv/bin/activate
(venv) $
4

Bằng cách thêm macro

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
38 vào menu điều hướng của bạn, bạn giữ cho mẫu điều hướng của bạn sạch sẽ. Bạn giao bất kỳ logic có điều kiện nào thành
PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS>
38.

Truy cập

a = r'f(x) = \frac{\exp(-x^2/2)}{\sqrt{2*\pi}}'
ax = plt.axes([0,0,0.3,0.3]) #left,bottom,width,height
ax.set_xticks([])
ax.set_yticks([])
ax.axis('off')
plt.text(0.4,0.4,'$%s$' %a,size=50,color="green")
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.

Trong hướng dẫn này, bạn đã học được cách:

  • Cài đặt động cơ mẫu Jinjatemplate engine
  • Tạo mẫu Jinja đầu tiên của bạntemplate
  • Hiển thị một mẫu jinja trong bìnhFlask
  • Sử dụng các vòng
    $ python3 -m venv venv
    $ source venv/bin/activate
    (venv) $
    
    5 và các câu lệnh có điều kiện với Jinja
    $ python3 -m venv venv
    $ source venv/bin/activate
    (venv) $
    
    5 loops
    and conditional statements with Jinja
  • Nest Jinja Mẫu Jinja templates
  • 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!