programing

Flask/Jinja2를 사용하여 HTML을 템플릿으로 전달

luckcodes 2022. 10. 8. 09:55

Flask/Jinja2를 사용하여 HTML을 템플릿으로 전달

Flask와 SQL Chemy의 관리자를 만들고 있는데, 다양한 입력에 대한 HTML을 제 뷰에 전달하고 싶습니다.render_template템플릿 프레임워크는 HTML에서 자동으로 빠져나가는 것 같기 때문에<"'>문자는 HTML 엔티티로 변환됩니다.HTML이 올바르게 렌더링되도록 하려면 어떻게 해야 하나요?

값을 렌더링할 때 자동 이스케이프를 해제하려면|safe필터링을 실시합니다.

{{ something|safe }}

신뢰할 수 없는 데이터를 이스케이프하지 않고 렌더링하면 사이트 간 스크립팅 취약성이 있으므로 신뢰할 수 있는 데이터에서만 이 작업을 수행하십시오.

Markup Safe는 Jinja의 자동 이스케이프 동작을 제공합니다.Import 할 수 있습니다.Markup코드로부터 안전한 HTML 값을 선언하기 위해 사용합니다.

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

이 정보를 템플릿에 전달하면|safe필터링을 합니다.

Jinja docs 섹션에서 HTML 이스케이프:

자동 이스케이프가 유효하게 되어 있는 경우, 세이프라고 명시적으로 마크 되어 있는 값을 제외하고, 모든 것이 디폴트로 이스케이프 됩니다.이러한 마크는 어플리케이션 또는 템플릿에서|safe필터링을 실시합니다.

예제:

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

이스케이프할 필요가 없는 변수가 많은 경우 오버라이드 블록을 사용할 수 있습니다.

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

일부 사람들은 문자열 표시를 조작하기 위해 보안 위험을 수반하는 자동 탈출을 해제하는 것 같습니다.

일부 줄 바꿈만 문자열에 삽입하고 줄 바꿈을 다음과 같이 변환하는 경우<br />다음과 같은 jinja 매크로를 사용할 수 있습니다.

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

템플릿에 있는 이 명령어를

{{ linebreaks_for_string( my_string_in_a_variable ) }}

를 사용합니다.safe템플릿을 필터링한 후 보기에서 라이브러리로 HTML을 삭제합니다.표백제를 사용하여 사용해야 하는 HTML 태그를 화이트리스트에 추가할 수 있습니다.

내가 아는 한 이게 제일 안전해.두 가지 다 해봤는데safe필터와Markupclass 및 두 가지 방법으로 원치 않는 JavaScript를 실행할 수 있습니다.안전하지 않아!

특히 줄 바꿈을 처리하기 위해 몇 가지 옵션을 시도해 본 후 최종적으로 이 방법을 선택했습니다.

{% set list1 = data.split('\n') %}
{% for item in list1 %}
{{ item }}
  {% if not loop.last %}
  <br/>
  {% endif %}
{% endfor %}

이 접근법의 장점은 자동이탈과 호환되므로 모든 것이 안전하다는 것입니다.urlize와 같은 필터와 조합할 수도 있습니다.

물론 Helge의 답변과 비슷하지만 매크로가 필요하지 않습니다(대신 Jinja의 빌트인에 있습니다).split하지 않고 불필요한 하지 않습니다.<br/>마지막 항목 뒤에.

언급URL : https://stackoverflow.com/questions/3206344/passing-html-to-template-using-flask-jinja2