Truyền HTML sang mẫu bằng Flask / Jinja2


163

Tôi đang xây dựng một quản trị viên cho Flask và SQLAlchemy và tôi muốn chuyển HTML cho các đầu vào khác nhau vào chế độ xem của mình bằng cách sử dụng render_template. Khung khuôn mẫu dường như tự động thoát khỏi html, vì vậy tất cả <"'> được chuyển đổi thành các thực thể html. Làm cách nào tôi có thể vô hiệu hóa nó để HTML hiển thị chính xác?

Câu trả lời:


343

cách lý tưởng là

{{ something|safe }}

Hơn tắt hoàn toàn tự động thoát.


2
xin chào @Armin Ronacher, bạn vui lòng giải thích thêm và cho một ví dụ? cảm ơn.
Samoth

Ý tôi là, ví dụ, tôi có một tệp được gọi userHome.htmlvà tôi muốn sử dụng return render_template('userHome.html'), nhưng nó không hiển thị chính xác và tất cả chuyển sang các thực thể html trong bảng điều khiển chrome của tôi.
Samoth

Trong transthẻ này phải được sử dụng là{% trans something=something|safe %}A {{something}} B{% endtrans %}
Kangur

1
Điều đáng nói là bạn nên cẩn thận để tránh các lỗ hổng Cross-Site Scripting khi bạn làm điều này, vì bạn đang vô hiệu hóa các biện pháp bảo vệ tích hợp của thư viện templating chống lại nó.
Harry Cutts

108

Bạn cũng có thể khai báo HTML an toàn từ mã:

from flask import Markup
value = Markup('<strong>The HTML String</strong>')

Sau đó chuyển giá trị đó cho các mẫu và họ không phải lấy |safenó.


4
Markup là một lớp Jinja2, vâng. Nó thực hiện một giao diện chung được hỗ trợ bởi nhiều thư viện python (tiếc là không phải Django). Bạn cũng có thể sử dụng gói an toàn đánh dấu thực hiện cùng một đối tượng: pypi.python.org/pypi/MarkupSafe
Armin Ronacher

nó tồn tại trong jinja2
Giovanni G. PY

23

Từ phần tài liệu jinja HTML Thoát :

Khi tự động thoát được bật, mọi thứ được thoát theo mặc định ngoại trừ các giá trị được đánh dấu rõ ràng là an toàn. Chúng có thể được đánh dấu bằng ứng dụng hoặc trong mẫu bằng cách sử dụng bộ lọc | an toàn.

Thí dụ:

 <div class="info">
   {{data.email_content|safe}}
 </div>

5

Khi bạn có nhiều biến không cần thoát, bạn có thể sử dụng một autoescapekhối:

{% autoescape off %}
{{ something }}
{{ something_else }}
<b>{{ something_important }}</b>
{% endautoescape %}

1

Một số người dường như biến autoescape tắt có thể mang theo nguy cơ bảo mật để thao tác màn hình hiển thị chuỗi.

Nếu bạn chỉ muốn chèn một số ngắt dòng vào một chuỗi và chuyển đổi các ngắt dòng thành <br />, thì bạn có thể lấy một macro jinja như:

{% macro linebreaks_for_string( the_string ) -%}
{% if the_string %}
{% for line in the_string.split('\n') %}
<br />
{{ line }}
{% endfor %}
{% else %}
{{ the_string }}
{% endif %}
{%- endmacro %}

và trong mẫu của bạn chỉ cần gọi nó với

{{ linebreaks_for_string( my_string_in_a_variable ) }}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.