Python - Templating

Templating in Python

Templating trong Python là một kỹ thuật được sử dụng trong phát triển web để tạo ra các trang HTML tĩnh một cách động bằng cách sử dụng các mẫu và dữ liệu.

Trong hướng dẫn này, chúng ta sẽ khám phá những điều cơ bản về việc sử dụng mẫu trong Python, bao gồm cài đặt, tạo mẫu và kết xuất mẫu với dữ liệu, với trọng tâm là công cụ tạo mẫu Jinja2.

String Templates in Python

Các mẫu chuỗi trong Python là một cách đơn giản để thực hiện thay thế chuỗi. Mô-đun chuỗi của Python bao gồm lớp Template , cung cấp một cách dễ dàng để thay thế các chỗ giữ chỗ trong một chuỗi bằng các giá trị thực tế.

The Template class in the string module is useful for dynamically forming a string object through a substitution technique described in PEP 292. Its simpler syntax and functionality make it easier to translate for internationalization purposes compared to other built-in string formatting facilities in Python.

Chuỗi mẫu sử dụng ký hiệu $ để thay thế, ngay sau đó là một định danh tuân theo các quy tắc tạo thành một định danh hợp lệ trong Python.

Creating a Template

Để tạo một mẫu, bạn khởi tạo lớp Template với một chuỗi chứa các chỗ giữ chỗ được tiền tố bằng $ như được hiển thị dưới đây −

from string import Template

template = Template("Hello, $name!")

Substituting Values

Bạn có thể thay thế các giá trị vào mẫu bằng cách sử dụng phương pháp substitute() , phương pháp này nhận một từ điển các cặp khóa-giá trị.

Phương thức substitute() thay thế các dấu chỗ (định danh) trong mẫu bằng các giá trị thực tế. Bạn có thể cung cấp các giá trị này bằng cách sử dụng các tham số từ khóa hoặc một từ điển. Phương thức sau đó trả về một chuỗi mới với các dấu chỗ đã được điền.

Example: Using Keyword Arguments

Đoạn mã sau thay thế các định danh trong một chuỗi mẫu bằng các đối số từ khóa -

from string import Template

tempStr = Template('Hello. My name is $name and my age is $age')
newStr = tempStr.substitute(name = 'Pushpa', age = 26)
print (newStr)

Nó sẽ tạo ra đầu ra sau đây −

Hello. My name is Pushpa and my age is 26

Example: Using a Dictionary

Trong ví dụ sau, chúng ta sử dụng một đối tượng từ điển để ánh xạ các định danh thay thế trong chuỗi mẫu −

from string import Template

tempStr = Template('Hello. My name is $name and my age is $age')
dct = {'name' : 'Pushpalata', 'age' : 25}
newStr = tempStr.substitute(dct)
print (newStr)

Dưới đây là đầu ra của đoạn mã trên −

Hello. My name is Pushpalata and my age is 25

Example: Missing Parameters Raises KeyError

Nếu phương thức substitute() không được cung cấp đủ tham số để đối chiếu với các định danh trong chuỗi mẫu, Python sẽ ném ra KeyError.

from string import Template

tempStr = Template('Hello. My name is $name and my age is $age')
dct = {'name' : 'Pushpalata'}
newStr = tempStr.substitute(dct)
print (newStr)

Sau đây là lỗi được tạo ra −

Traceback (most recent call last):
  File "/home/cg/root/667e441d9ebd5/main.py", line 5, in <module>
newStr = tempStr.substitute(dct)
  File "/usr/lib/python3.10/string.py", line 121, in substitute
    return self.pattern.sub(convert, self.template)
  File "/usr/lib/python3.10/string.py", line 114, in convert
return str(mapping[named])
KeyError: 'age'

Substituting Values Using safe_substitute() Method

Phương thức safe_substitute() hoạt động tương tự như phương thức substitute(), ngoại trừ việc nó không ném ra lỗi nếu các khóa không đủ hoặc không khớp. Thay vào đó, các placeholder gốc sẽ xuất hiện nguyên vẹn trong chuỗi kết quả.

Example

Trong ví dụ sau, chúng ta đang sử dụng phương thức safe_substitue() để thay thế các giá trị −

from string import Template
tempStr = Template('Hello. My name is $name and my age is $age')
dct = {'name' : 'Pushpalata'}
newStr = tempStr.safe_substitute(dct)
print (newStr)

Nó sẽ tạo ra đầu ra sau đây −

Hello. My name is Pushpalata and my age is $age

Installing Jinja2

Để sử dụng Jinja2 cho việc lập khuôn trong Python, trước tiên bạn cần cài đặt thư viện. Jinja2 là một công cụ lập khuôn mạnh mẽ thường được sử dụng trong phát triển web để tạo ra HTML. Nó có thể được cài đặt dễ dàng bằng cách sử dụng pip, trình cài đặt gói của Python −

pip install jinja2

Creating and Rendering Jinja2 Templates

Jinja2 là một công cụ tạo mẫu mạnh mẽ cho Python cho phép bạn tạo nội dung động bằng cách kết hợp các tệp mẫu tĩnh với dữ liệu. Phần này khám phá cách tạo các mẫu Jinja2 và hiển thị chúng với dữ liệu.

Creating a Jinja2 Template

Để tạo một mẫu Jinja2, bạn định nghĩa một chuỗi mẫu hoặc tải nó từ một tệp. Các mẫu sử dụng dấu ngoặc nhọn đôi {{ ... }} cho các vị trí giữ chỗ và hỗ trợ các cấu trúc điều khiển như "vòng lặp" và "điều kiện" với {% ... %} .

Example

Dưới đây là một ví dụ về một mẫu Jinja2 đơn giản được lưu trữ trong tệp "template.html" −

<!DOCTYPE html>
<html>
<head>
    <title>Hello, {{ name }}!</title>
</head>
<body>
    <h1>Hello, {{ name }}!</h1>
    <p>Welcome to our site.</p>
</body>
</html>

Rendering a Jinja2 Template

Để render một mẫu Jinja2, hãy làm theo các bước sau −

  • Loading the Template − Tải mẫu từ một tệp hoặc tạo nó từ một chuỗi.

  • Creating a Template Object − Sử dụng "jinja2.Template" để tạo một đối tượng mẫu.

  • Rendering − Sử dụng phương thức render() trên đối tượng mẫu, truyền dữ liệu dưới dạng tham số hoặc từ điển.

Example

Ở đây, chúng ta đang kết xuất mẫu Jinja2 −

from jinja2 import Template, FileSystemLoader, Environment

# Loading a template from a file (template.html)
file_loader = FileSystemLoader('.')
env = Environment(loader=file_loader)
template = env.get_template('template.html')

# Rendering the template with data
output = template.render(name='Alice')

# Output the rendered template
print(output)

Đầu ra của mẫu Jinja2 đã được kết xuất sẽ là một tài liệu HTML với các vị trí giữ chỗ được thay thế bằng dữ liệu thực tế được truyền vào trong quá trình kết xuất.

<!DOCTYPE html>
<html>
<head>
    <title>Hello, Alice!</title>
</head>
<body>
    <h1>Hello, Alice!</h1>
    <p>Welcome to our site.</p>
</body>
</html>

Advanced Jinja2 Features

Jinja2 supports various advanced features such as loops, conditionals, and custom filters, making it a powerful tool for creating complex templates.

Template Inheritance

Jinja2 hỗ trợ kế thừa mẫu, cho phép bạn tạo một mẫu cơ sở với các yếu tố chung (như tiêu đề, chân trang, thanh điều hướng) và mở rộng hoặc ghi đè các khối cụ thể trong các mẫu con. Điều này thúc đẩy việc tái sử dụng mã và khả năng bảo trì trong các dự án lớn.

Example

Tệp mẫu HTML này có tên "base.html" định nghĩa một cấu trúc cơ bản cho một trang web sử dụng cú pháp mẫu Jinja2.

Nó bao gồm các khối "{% block title %}" và "{% block content %}" có thể được ghi đè trong các mẫu kế thừa để tùy chỉnh tiêu đề và nội dung chính của trang, tương ứng.

<!-- base.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}Default Title{% endblock %}</title>
</head>
<body>
    {% block content %}{% endblock %}
</body>
</html>

Tệp mẫu Jinja2 sau đây "child.html" mở rộng mẫu "base.html", ghi đè khối tiêu đề để đặt nó thành "Child Page" và khối nội dung để bao gồm một tiêu đề <h1> với văn bản "Nội dung trang con".

<!-- child.html -->
{% extends "base.html" %}

{% block title %}Child Page{% endblock %}

{% block content %}
<h1>Child Page Content</h1>
{% endblock %}

Loops

Jinja2 cho phép bạn lặp qua các danh sách hoặc các đối tượng có thể lặp khác bằng cách sử dụng các vòng lặp {% for %} . Dưới đây là một ví dụ về cách bạn có thể sử dụng vòng lặp để tạo ra một danh sách không thứ tự (<ul>) trong HTML −

<ul>
{% for item in items %}
    <li>{{ item }}</li>
{% endfor %}
</ul>

Conditionals

Câu lệnh điều kiện trong Jinja2 ({% if %} {% else %}) được sử dụng để điều khiển luồng của các mẫu dựa trên các điều kiện. Dưới đây là một ví dụ nơi "Jinja2" kiểm tra xem người dùng có tồn tại hay không và hiển thị một lời chào cá nhân nếu đúng; nếu không, nó sẽ nhắc người dùng đăng nhập −

{% if user %}
    <p>Welcome, {{ user }}!</p>
{% else %}
    <p>Please log in.</p>
{% endif %}

Custom Filters

Các bộ lọc tùy chỉnh trong Jinja2 được sử dụng để định nghĩa các bộ lọc riêng của bạn nhằm thao tác dữ liệu trước khi hiển thị nó trong mẫu.

Trong ví dụ sau, một bộ lọc tùy chỉnh có tên là reverse được định nghĩa trong Jinja2 để đảo ngược chuỗi "hello", dẫn đến kết quả là "olleh" khi được áp dụng trong mẫu −

# Define a custom filter function
def reverse_string(s):
    return s[::-1]

# Register the filter with the Jinja2 environment
env.filters['reverse'] = reverse_string

Trong mẫu của bạn, bạn có thể áp dụng bộ lọc "reverse" cho bất kỳ chuỗi nào −

{{ "hello" | reverse }}

Sau đây là đầu ra thu được −

olleh