2012-01-23 31 views

Trả lời

11

Bạn có thể viết bộ lọc của riêng mình. scrubber library là khá tốt trong việc dọn dẹp HTML. Bộ lọc sẽ cần bọc chuỗi được trả lại trong jinja2.Markup để mẫu sẽ không thoát khỏi chuỗi đó.

Edit: một ví dụ mã

import jinja2 
import scrubber 

def sanitize_html(text): 
    return jinja2.Markup(scrubber.Scrubber().scrub(text)) 

jinja_env.filters['sanitize_html'] = sanitize_html 
11

Bạn sẽ muốn phân tích đầu vào trên trình sử dụng một cách tiếp cận danh sách trắng - có rất nhiều ví dụ tốt in this questionviable options ra khỏi đó.

Một khi bạn đã làm điều đó, bạn có thể đánh dấu bất kỳ biến sẽ chứa HTML mà không được kết thúc bằng các bộ lọc safe:

{{comment|safe}} 
6

Thư viện Bleach có thể làm rất tốt.

Ví dụ, giả sử biến 'jinja_env' là trong phạm vi:

from bleach import clean 
from markupsafe import Markup 

def do_clean(text, **kw): 
    """Perform clean and return a Markup object to mark the string as safe. 
    This prevents Jinja from re-escaping the result.""" 
    return Markup(clean(text, **kw)) 

jinja_env.filters['clean'] = do_clean 

Sau đó, trong một mẫu mà bạn có thể có một cái gì đó như:

<p>{{ my_variable|clean(tags=['img', 'b', 'i', 'em', 'strong'], attributes={'img': ['src', 'alt', 'title', 'width', 'height']}) }}</p> 

Bạn cũng có thể sử dụng một callable (thay vì một danh sách) trong các thuộc tính, cho phép xác nhận kỹ lưỡng hơn các thuộc tính (ví dụ như kiểm tra xem src có cung cấp một URL hợp lệ) hay không. Tài liệu hiển thị an example.

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