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
필터와Markup
class 및 두 가지 방법으로 원치 않는 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
'programing' 카테고리의 다른 글
'super'는 Python에서 무엇을 합니까? - super()의 차이점.__init__() 및 명시적 슈퍼클래스 __init_() (0) | 2022.10.08 |
---|---|
문자열 스트레이트 JavaScript 잘라내기 (0) | 2022.10.08 |
다른 선택문의 결과로 선택문을 작성할 수 있습니까? (0) | 2022.10.08 |
확장자가 .a인 파일은 무엇입니까? (0) | 2022.10.08 |
PHP 지정된 디렉터리의 모든 하위 디렉터리 가져오기 (0) | 2022.10.08 |