2012-10-01 40 views
8

Tôi đang sử dụng Flask trong ứng dụng hiển thị một số dữ liệu từ cơ sở dữ liệu sqlite. Vấn đề của tôi là khi ứng dụng hiển thị một số văn bản có html bên trong, xuất hiện dưới dạng văn bản thay vì html. Ví dụ, các bản ghi trong cơ sở dữ liệu có các văn bản sau:Làm cách nào để hiển thị nội dung html bằng jinja bằng bình?

My tailor <strong>is</strong> rich 

Các trang html render như là:

<html> 
<!-- snip .... --> 
My tailor &gt;strong&lt;is&gt;/strong&lt; rich 
<!-- snip .... --> 
</html> 

Và, những gì tôi muốn đây là ("là" lời có phải táo bạo hơn) :

<html> 
<!-- snip .... --> 
My tailor <strong>is</strong> rich 
<!-- snip .... --> 
</html> 

Có ai biết cách tôi có thể làm điều đó không?

Trả lời

26

Nếu bạn biết nội dung là an toàn, chỉ cần sử dụng safe lọc:

{# In the Jinja template #} 
{% for article in articles %} 
<div class="article">{{article|safe}}</div> 
{% endfor %} 
-1

Một khả năng khác là sử dụng lớp jinja Markup, chỉ cách lọc an toàn không. Điều này sẽ cho phép bạn hiển thị HTML mà không lọc nội dung thông qua bộ lọc an toàn. Dưới đây là ví dụ về cách thực hiện điều này.

from jinja2 import Markup, escape 

def render_markup(): 
    return Markup("{0}{1}{2}{3}{4}".format(
     escape("My tailor "), 
     "<strong>", 
     escape("is"), 
     "</strong>", 
     escape(" rich"))) 

Sau này, bạn có thể đăng ký chức năng của bạn trong hình cầu jinja Flask và sử dụng nó từ mẫu jinja.

app.jinja_env.globals["render_markup"] = render_markup 

Không cần thiết an toàn trong mẫu.

<html> 
<!-- snip .... --> 
{{ render_markup() }} 
<!-- snip .... --> 
</html> 
+4

tôi sẽ rip bất cứ ai từng mảnh trong mã số nhận xét nếu ông đã xây dựng một thông báo như bạn làm trong ví dụ đầu tiên của bạn :) – ThiefMaster

+0

Heh, chỉ là một ví dụ hơi ngớ ngẩn về cách định dạng chuỗi thậm chí ngờ nghệch và buồn, và sử dụng đúng cách thoát chức năng :) – Boris

Các vấn đề liên quan