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


163

Flask 및 SQLAlchemy에 대한 관리자를 구축 중이며을 사용하여 다른 입력에 대한 HTML을 내보기에 전달하고 싶습니다 render_template. 템플릿 프레임 워크가 html을 자동으로 이스케이프 처리하는 것처럼 보이므로 모든 < " '>가 html 엔터티로 변환됩니다. HTML을 올바르게 렌더링하도록 비활성화하려면 어떻게해야합니까?

답변:


344

이상적인 방법은

{{ something|safe }}

자동 이스케이프 기능을 완전히 끄는 것보다


2
@Armin Ronacher 님, 더 설명하고 예를 들어 주시겠습니까? 감사.
Samoth

예를 들어,이라는 파일이 있고을 userHome.html사용 return render_template('userHome.html')하고 싶지만 올바르게 렌더링되지 않고 모든 것이 크롬 콘솔에서 html 엔티티 로 바뀝니다 .
Samoth

trans태그이 사용되어야한다{% trans something=something|safe %}A {{something}} B{% endtrans %}
Kangur

1
템플릿 라이브러리의 기본 제공 보호 기능을 사용하지 않도록 설정하면이 작업을 수행 할 때 사이트 간 스크립팅 취약점 을 피해야 합니다.
Harry Cutts 17

108

코드에서 HTML로 안전하게 선언 할 수도 있습니다.

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

그런 다음 해당 값을 템플릿에 전달하면 필요하지 않습니다 |safe.


4
마크 업은 Jinja2 클래스입니다. 많은 파이썬 라이브러리 (Django가 아님)가 지원하는 공통 인터페이스를 구현합니다. 또한 마크 업 안전 패키지를 사용할 수있는 구현 동일한 개체 : pypi.python.org/pypi/MarkupSafe
아르 민 Ronacher

jinja2에 존재
Giovanni G. PY

23

jinja 문서 섹션 HTML 이스케이프에서 :

자동 이스케이프가 활성화되면 명시 적으로 안전한 것으로 표시된 값을 제외하고 모든 것이 기본적으로 이스케이프됩니다. 이들은 안전 필터를 사용하여 응용 프로그램 또는 템플리트에서 표시 할 수 있습니다.

예:

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

5

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

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

1

어떤 사람들은 문자열 표시를 조작하기 위해 보안 위험 을 수반하는 자동 이스케이프 기능을 끄는 것 같습니다 .

문자열에 줄 바꿈 만 삽입하고 줄 바꿈을로 변환하려면 jinja 매크로를 사용할 <br />수 있습니다 .

{% 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 ) }}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.