2009-12-01 8 views
11

Tôi sử dụng giá treo với các mẫu Mako và tôi muốn tránh gõ này tất cả các thời gian:Đánh dấu chuỗi như an toàn trong Mako

${ h.some_function_that_outputs_html() | n } 

Tôi muốn bằng cách nào đó đánh dấu chức năng, hoặc một biến là an toàn (bạn có thể làm điều đó ở Django) vì vậy tôi không cần phải đăng nhập tất cả thời gian. Bất kỳ ý tưởng?

Trả lời

10

Tôi chỉ phát hiện ra rằng nếu bạn đặt một phương pháp html lớp của bạn, sau đó Mako sẽ chỉ gọi phương thức đó và xuất ra bất cứ thứ gì nó trả về trong khuôn mẫu.

Vì vậy, tôi đã làm:

def __html__(self): 
    return unicode(self) 

Đó là cơ bản những gì h.literal làm.

+0

Điều này phải đi vào "lớp" được trả về bởi 'h.some_function_that_outputs_html()' Tôi giả sử. – Felix

3

Theo số mako docs about filtering, bạn có thể đặt bộ lọc mặc định được áp dụng bên trong các mẫu khi tạo Template mới cũng như cho TemplateLookup (trong trường hợp này sẽ được áp dụng theo mặc định cho tất cả các mẫu mà nó trông lên), với đối số default_filters.

giá treo sử dụng lập luận này với TemplateLookup để thiết lập giá trị mặc định cho dự án của bạn bên trong config/environment.py file:

# Create the Mako TemplateLookup, with the default auto-escaping 
config['pylons.app_globals'].mako_lookup = TemplateLookup(
    directories=paths['templates'], 
    error_handler=handle_mako_error, 
    module_directory=os.path.join(app_conf['cache_dir'], 'templates'), 
    input_encoding='utf-8', default_filters=['escape'], 
    imports=['from webhelpers.html import escape']) 

Đây là lý do tại sao bạn sẽ có được thoát theo mặc định (mà không phải là trường hợp khi bạn sử dụng Mako một mình). Vì vậy, bạn có thể thay đổi nó trên toàn cầu trong tập tin cấu hình, hoặc không dựa vào tra cứu tiêu chuẩn. Hãy cẩn thận rằng bạn nên tất nhiên sau đó sử dụng một bộ lọc một cách rõ ràng để thoát khỏi những điều cần thoát.

Bạn cũng có thể vượt qua một chuỗi "đánh dấu là an toàn" với helper giá treo h.literal, ví dụ nếu bạn sẽ vượt qua h.literal('This will <b>not</b> be escaped') để mẫu, nói như là một biến tên là spam, bạn chỉ có thể sử dụng ${spam} mà không thoát.

Nếu bạn muốn tác dụng tương tự khi bạn gọi một hàm nhất định từ bên trong mẫu, hàm này sẽ cần trả về một chữ hoặc cung cấp trợ giúp cho hàm đó gọi h.literal nếu bạn muốn thoát khỏi chức năng ban đầu một mình. (hoặc tôi đoán bạn cũng có thể gọi nó thông qua một "Lọc def" (xem cùng một tài liệu Mako như trên), chưa thử nghiệm với điều đó chưa)

+0

Cảm ơn, điều này đã làm việc cho tôi – disc0dancer

+0

Chỉ cần thông báo cho những người sử dụng giải pháp đầu tiên (loại bỏ thoát khỏi default_filters) - bạn phải xóa bộ nhớ cache (rm -r data/templates/*) để xem nó hoạt động tự hỏi có gì sai). – zefciu