Flask kết xuất chuỗi HTML

Flask tận dụng Jinja2 làm công cụ mẫu của nó. Rõ ràng là bạn có thể tự do sử dụng một công cụ mẫu khác, nhưng bạn vẫn phải cài đặt Jinja2 để tự chạy Flask. Yêu cầu này là cần thiết để bật tiện ích mở rộng phong phú. Một tiện ích mở rộng có thể phụ thuộc vào sự hiện diện của Jinja2

Phần này chỉ giới thiệu rất nhanh về cách Jinja2 được tích hợp vào Flask. Nếu bạn muốn biết thông tin về chính cú pháp của công cụ mẫu, hãy truy cập Tài liệu mẫu Jinja2 chính thức để biết thêm thông tin

Thiết lập Jinja

Trừ khi được tùy chỉnh, Jinja2 được cấu hình bởi Flask như sau

  • autoescaping được bật cho tất cả các mẫu kết thúc bằng .html, .htm,

    {% autoescape false %}
        <p>autoescaping is disabled here
        <p>{{ will_not_be_escaped }}
    {% endautoescape %}
    
    0,
    {% autoescape false %}
        <p>autoescaping is disabled here
        <p>{{ will_not_be_escaped }}
    {% endautoescape %}
    
    1, cũng như
    {% autoescape false %}
        <p>autoescaping is disabled here
        <p>{{ will_not_be_escaped }}
    {% endautoescape %}
    
    2 khi sử dụng
    {% autoescape false %}
        <p>autoescaping is disabled here
        <p>{{ will_not_be_escaped }}
    {% endautoescape %}
    
    3

  • autoescaping được bật cho tất cả các chuỗi khi sử dụng

    {% autoescape false %}
        <p>autoescaping is disabled here
        <p>{{ will_not_be_escaped }}
    {% endautoescape %}
    
    4

  • một mẫu có khả năng chọn tham gia/không tự động thoát bằng thẻ

    {% autoescape false %}
        <p>autoescaping is disabled here
        <p>{{ will_not_be_escaped }}
    {% endautoescape %}
    
    5

  • Flask chèn một vài hàm toàn cầu và trình trợ giúp vào ngữ cảnh Jinja2, ngoài các giá trị có sẵn theo mặc định

Bối cảnh tiêu chuẩn

Theo mặc định, các biến toàn cầu sau đây có sẵn trong các mẫu Jinja2

cấu hình

Đối tượng cấu hình hiện tại ()

Nhật ký thay đổi

Đã thay đổi trong phiên bản 0. 10. Tính năng này hiện luôn khả dụng, ngay cả trong các mẫu đã nhập.

Mới trong phiên bản 0. 6

lời yêu cầu

Đối tượng yêu cầu hiện tại (). Biến này không khả dụng nếu mẫu được hiển thị mà không có ngữ cảnh yêu cầu đang hoạt động

phiên họp

Đối tượng phiên hiện tại (). Biến này không khả dụng nếu mẫu được hiển thị mà không có ngữ cảnh yêu cầu đang hoạt động

g

Đối tượng ràng buộc yêu cầu cho các biến toàn cục (). Biến này không khả dụng nếu mẫu được hiển thị mà không có ngữ cảnh yêu cầu đang hoạt động

url_for()

Chức năng

get_flashed_messages()

Chức năng

Hành vi bối cảnh Jinja

Các biến này được thêm vào ngữ cảnh của các biến, chúng không phải là biến toàn cục. Sự khác biệt là theo mặc định, chúng sẽ không hiển thị trong ngữ cảnh của các mẫu đã nhập. Điều này một phần là do cân nhắc về hiệu suất, một phần là để giữ mọi thứ rõ ràng

Điều này có ý nghĩa gì với bạn?

  1. bạn rõ ràng chuyển yêu cầu tới macro dưới dạng tham số hoặc thuộc tính của đối tượng yêu cầu mà bạn quan tâm

  2. bạn nhập macro "có ngữ cảnh"

Nhập khẩu với bối cảnh trông như thế này

{% from '_helpers.html' import my_macro with context %}

Kiểm soát thoát tự động

Autoescaping là khái niệm tự động thoát các ký tự đặc biệt cho bạn. Các ký tự đặc biệt theo nghĩa của HTML (hoặc XML, và do đó là XHTML) là

@app.template_filter('reverse')
def reverse_filter(s):
    return s[::-1]

def reverse_filter(s):
    return s[::-1]
app.jinja_env.filters['reverse'] = reverse_filter
2,
@app.template_filter('reverse')
def reverse_filter(s):
    return s[::-1]

def reverse_filter(s):
    return s[::-1]
app.jinja_env.filters['reverse'] = reverse_filter
3,
@app.template_filter('reverse')
def reverse_filter(s):
    return s[::-1]

def reverse_filter(s):
    return s[::-1]
app.jinja_env.filters['reverse'] = reverse_filter
4,
@app.template_filter('reverse')
def reverse_filter(s):
    return s[::-1]

def reverse_filter(s):
    return s[::-1]
app.jinja_env.filters['reverse'] = reverse_filter
5 cũng như
@app.template_filter('reverse')
def reverse_filter(s):
    return s[::-1]

def reverse_filter(s):
    return s[::-1]
app.jinja_env.filters['reverse'] = reverse_filter
6. Vì các ký tự này tự chúng mang ý nghĩa cụ thể trong tài liệu nên bạn phải thay thế chúng bằng cái gọi là "thực thể" nếu bạn muốn sử dụng chúng cho văn bản. Không làm như vậy không chỉ khiến người dùng thất vọng vì không thể sử dụng các ký tự này trong văn bản mà còn có thể dẫn đến các vấn đề về bảo mật. (thấy )

Tuy nhiên, đôi khi bạn sẽ cần phải tắt tính năng thoát tự động trong các mẫu. Đây có thể là trường hợp nếu bạn muốn đưa HTML vào các trang một cách rõ ràng, chẳng hạn nếu chúng đến từ một hệ thống tạo HTML an toàn như trình chuyển đổi đánh dấu sang HTML

Có ba cách để thực hiện điều đó

  • Trong mã Python, bọc chuỗi HTML trong một đối tượng trước khi chuyển nó tới mẫu. Đây nói chung là cách được khuyến nghị

  • Bên trong mẫu, sử dụng bộ lọc

    @app.template_filter('reverse')
    def reverse_filter(s):
        return s[::-1]
    
    def reverse_filter(s):
        return s[::-1]
    app.jinja_env.filters['reverse'] = reverse_filter
    
    8 để đánh dấu rõ ràng một chuỗi là HTML an toàn (
    @app.template_filter('reverse')
    def reverse_filter(s):
        return s[::-1]
    
    def reverse_filter(s):
        return s[::-1]
    app.jinja_env.filters['reverse'] = reverse_filter
    
    9)

  • Tạm thời vô hiệu hóa hoàn toàn hệ thống autoescape

Để tắt hệ thống thoát tự động trong các mẫu, bạn có thể sử dụng khối

{% autoescape false %}
    <p>autoescaping is disabled here
    <p>{{ will_not_be_escaped }}
{% endautoescape %}
5

{% autoescape false %}
    <p>autoescaping is disabled here
    <p>{{ will_not_be_escaped }}
{% endautoescape %}

Bất cứ khi nào bạn làm điều này, vui lòng hết sức thận trọng về các biến bạn đang sử dụng trong khối này

Đăng ký bộ lọc

Nếu bạn muốn đăng ký bộ lọc của riêng mình trong Jinja2, bạn có hai cách để làm điều đó. Bạn có thể đặt chúng bằng tay vào ứng dụng hoặc sử dụng công cụ trang trí

Hai ví dụ sau hoạt động giống nhau và cả hai đều đảo ngược một đối tượng

@app.template_filter('reverse')
def reverse_filter(s):
    return s[::-1]

def reverse_filter(s):
    return s[::-1]
app.jinja_env.filters['reverse'] = reverse_filter

Trong trường hợp trình trang trí, đối số là tùy chọn nếu bạn muốn sử dụng tên hàm làm tên của bộ lọc. Sau khi đăng ký, bạn có thể sử dụng bộ lọc trong các mẫu của mình theo cách tương tự như các bộ lọc dựng sẵn của Jinja2, ví dụ: nếu bạn có một danh sách Python trong ngữ cảnh được gọi là mylist

{% for x in mylist | reverse %}
{% endfor %}

Bộ xử lý bối cảnh

Để tự động đưa các biến mới vào ngữ cảnh của mẫu, bộ xử lý ngữ cảnh tồn tại trong Flask. Bộ xử lý ngữ cảnh chạy trước khi mẫu được hiển thị và có khả năng đưa các giá trị mới vào ngữ cảnh mẫu. Bộ xử lý ngữ cảnh là một hàm trả về từ điển. Các khóa và giá trị của từ điển này sau đó được hợp nhất với ngữ cảnh mẫu cho tất cả các mẫu trong ứng dụng

@app.context_processor
def inject_user():
    return dict(user=g.user)

Bộ xử lý ngữ cảnh ở trên cung cấp một biến có tên là người dùng trong mẫu với giá trị là g. người sử dụng. Ví dụ này không thú vị lắm vì dù sao g cũng có sẵn trong các mẫu, nhưng nó đưa ra ý tưởng về cách thức hoạt động của nó

Các biến không giới hạn giá trị;

@app.context_processor
def utility_processor():
    def format_price(amount, currency="€"):
        return f"{amount:.2f}{currency}"
    return dict(format_price=format_price)

Trình xử lý ngữ cảnh ở trên cung cấp hàm format_price cho tất cả các mẫu

{{ format_price(0.33) }}

Bạn cũng có thể tạo format_price làm bộ lọc mẫu (xem phần ), nhưng điều này minh họa cách chuyển các hàm trong bộ xử lý ngữ cảnh

truyền trực tuyến

Có thể hữu ích nếu không hiển thị toàn bộ mẫu dưới dạng một chuỗi hoàn chỉnh, thay vào đó hiển thị dưới dạng luồng, tạo ra các chuỗi gia tăng nhỏ hơn. Điều này có thể được sử dụng để truyền phát HTML theo khối để tăng tốc độ tải trang ban đầu hoặc để tiết kiệm bộ nhớ khi hiển thị một mẫu rất lớn

Công cụ mẫu Jinja2 hỗ trợ hiển thị từng mẫu một, trả về một chuỗi lặp. Flask cung cấp các chức năng và để làm cho điều này dễ sử dụng hơn

from flask import stream_template

@app.get("/timeline")
def timeline():
    return stream_template("timeline.html")

Các chức năng này tự động áp dụng trình bao bọc nếu một yêu cầu đang hoạt động, để nó vẫn có sẵn trong mẫu

Flask có hỗ trợ HTML động không?

Trong Flask, bạn có thể sử dụng ngôn ngữ tạo khuôn mẫu Jinja để hiển thị các mẫu HTML . Mẫu là một tệp có thể chứa cả nội dung cố định và động.

Làm cách nào để hiển thị đầu ra Python trong trang HTML Flask?

tạo lớp Tiền đồn lớp Tiền đồn. def __init__(bản thân). bản thân. tiền đồn = [] def add_outpost(bản thân, dữ liệu). bản thân. tiền đồn. nối thêm (dữ liệu)
tạo một bản sao của Outposts cho hàm exec() và chạy hàm exec(). exec_outposts = Tiền đồn() thực thi()
trong chức năng thực thi thay thế bản in bằng exec_outposts. add_outpost(văn bản)

Render_template_string là gì?

render_template_string là một hàm Flask từ bình. gói tạo mẫu . render_template được sử dụng để tạo đầu ra từ một chuỗi được truyền vào thay vì từ một tệp trong thư mục mẫu. Lưu ý rằng render_template_string đôi khi được nhập từ gói bình thay vì từ bình. khuôn mẫu.

Flask có sử dụng HTML và CSS không?

Flask cho phép chúng tôi tích hợp các tệp HTML và CSS làm mẫu cho trang web của bạn .