2013-01-12 41 views
8

Làm cách nào để bạn hiển thị dữ liệu JSON một cách an toàn trong một ứng dụng web django?An toàn Sử dụng JSON với html bên trong JSON trong Mẫu Django

Trên máy chủ trong django tôi tạo dữ liệu JSON và sau đó hiển thị dữ liệu JSON đó trong mẫu django. JSON đôi khi chứa các đoạn mã html. Hầu hết thời gian, tuy nhiên, nếu thẻ </script> nằm bên trong dữ liệu JSON khi nó được hiển thị, nó sẽ phá hủy javascript xung quanh.

Ví dụ ...

Trên máy chủ, trong python tôi sẽ có điều này:

template_data = { 
    'my_json' : '[{"my_snippet": "<b>Happy HTML</b>"}]' 
} 
# pass the template data to the django template 
return render_to_response('my_template.html', template_data, context_instance = c) 

Và sau đó trong mẫu:

<script type="text/javascript"> 
var the_json = {{my_json|safe}}; 
</script> 
... some html ... 

Các kết quả html hoạt động tốt và trông giống như sau:

<script type="text/javascript"> 
var the_json = [{"my_snippet": "<b>Happy HTML</b>"}]; 
</script> 
... some html ... 

Tuy nhiên, bạn gặp vấn đề khi nào, trên máy chủ, JSON trông như thế này:

template_data = { 
    'my_json' : '[{"my_snippet": "Bad HTML</script>"}]' 
} 
return render_to_response('my_template.html', template_data, context_instance = c) 

Bây giờ, khi nó được trả lại, bạn sẽ nhận được:

<script type="text/javascript"> 
var the_json = [{"my_snippet": "Bad HTML</script>"}]; 
</script> 
... some html ... 

Thẻ kịch bản lệnh đóng trong mã JSON được coi là đóng toàn bộ khối tập lệnh. Tất cả javascript của bạn sau đó sẽ phá vỡ.

Một giải pháp có thể là kiểm tra </script> khi chuyển dữ liệu mẫu vào mẫu, nhưng tôi cảm thấy có cách tốt hơn.

+0

Bạn có thể phục vụ nó như json (thông qua AJAX) hoặc phục vụ nó như là một tập tin javascript (sau đó bao gồm nó bằng cách sử dụng một thẻ script). – DanielB

Trả lời

14

an toàn chèn JSON như là một chuỗi, và sau đó gọi JSON.parse vào nó

Sử dụng escapejs thay vì an toàn. Nó được thiết kế để xuất ra JavaScript.

var the_json = '{{my_json|escapejs}}'; 

Để nhận đối tượng JavaScript bạn cần gọi JSON.parse trên chuỗi đó. Điều này luôn luôn thích hợp hơn việc bán mã hóa JSON vào tập lệnh của bạn và đánh giá nó trực tiếp vì lý do bảo mật.

Một bộ lọc hữu ích để có được đối tượng python trực tiếp cho khách hàng mà tôi sử dụng là:

@register.filter 
def to_js(value): 
    """ 
    To use a python variable in JS, we call json.dumps to serialize as JSON server-side and reconstruct using 
    JSON.parse. The serialized string must be escaped appropriately before dumping into the client-side code. 
    """ 
    # separators is passed to remove whitespace in output 
    return mark_safe('JSON.parse("%s")' % escapejs(json.dumps(value, separators=(',', ':')))) 

Và sử dụng nó như:

var Settings = {{ js_settings|to_js }}; 
+0

Nếu bạn làm điều đó thì 'the_json' trở thành một chuỗi, không phải là đối tượng json javascript. – speedplane

+1

Bạn có thể làm 'var the_json = JSON.parse ({{my_json | escapejs}})' – DanielB

+1

Tôi nghĩ bạn cần trích dẫn nó, như sau: 'var the_json = JSON.parse ('{{my_json | escapejs}}') ' – speedplane

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