Jinja2 를 사용한 안전한 동적 템플릿 생성

FlaskBeginner
지금 연습하기

소개

Python 내에서 HTML 을 생성하는 것은 재미가 없고, 실제로 애플리케이션의 보안을 유지하기 위해 직접 escape를 사용하여 HTML 이스케이핑을 수행해야 하기 때문에 매우 번거롭습니다. 그렇기 때문에 Flask 는 자동으로 Jinja2 템플릿 엔진을 구성합니다. 템플릿은 모든 유형의 텍스트 파일을 생성하는 데 사용할 수 있습니다. 웹 애플리케이션의 경우 주로 HTML 페이지를 생성하겠지만, 이메일용 마크다운, 일반 텍스트 등 다른 모든 것도 생성할 수 있습니다.

이 랩에서는 Jinja2 템플릿 엔진을 사용하여 안전하고 동적인 템플릿을 생성하는 방법을 배웁니다.

템플릿 렌더링

이 단계에서는 Jinja2 템플릿 엔진을 사용하여 템플릿 렌더링을 구현합니다.

  1. rendering_templates.py 파일을 열고 먼저 Flask 클래스와 render_template를 import 합니다. 그런 다음 Flask 클래스의 인스턴스를 생성합니다.
from flask import Flask, render_template
app = Flask(__name__)
  1. 다음으로 route() 데코레이터를 사용하여 //<name> 두 개의 라우트를 생성하여 hello라는 하나의 뷰 함수를 공유합니다. 템플릿을 렌더링하려면 render_template() 메서드를 사용할 수 있습니다. 이는 Jinja2 템플릿 엔진으로 템플릿을 렌더링하기 위해 Flask 에서 제공됩니다. 해야 할 일은 템플릿의 이름과 템플릿 엔진에 키워드 인수로 전달하려는 변수를 제공하는 것입니다. 뷰 함수에서 render_template() 메서드를 사용하여 name이라는 변수를 사용하여 hello.html 템플릿을 렌더링합니다.
@app.route('/')
@app.route('/<name>')
def hello(name=None):
    return render_template('hello.html', name=name)
  1. 포트 (예: port=5000) 에서 Flask 애플리케이션을 시작하기 위해 스크립트의 main 진입점을 생성합니다. 그런 다음 debug 모드를 활성화합니다.
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000, debug=True)
  1. Flask 는 기본적으로 templates 폴더에서 템플릿을 찾습니다. 따라서 templates라는 폴더를 만들고 해당 폴더 아래에 hello.html이라는 파일을 만들어야 합니다. 터미널에서 다음 명령을 실행하여 필요한 폴더와 파일을 만들 수 있습니다.
cd ~/project
mkdir templates
cd templates
touch hello.html
  1. templates/hello.html 파일을 열고 다음 코드를 작성합니다.
<!doctype html>
<title>Hello from Flask</title>
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello, World!</h1>
{% endif %}

위 코드는 Jinja2 의 조건 블록을 사용합니다. name 변수가 truthy(None 또는 비어 있지 않음) 인지 확인합니다. 그렇다면 Hello {{ name }}! 내용이 표시됩니다. 그렇지 않으면 Hello, World! 내용이 표시됩니다.

  1. 애플리케이션을 실행하려면 먼저 다음 명령을 사용하여 터미널에서 Flask 애플리케이션을 시작합니다.
cd ~/project
python3 rendering_templates.py
  1. 그런 다음 인터페이스 상단에 있는 "Web 5000" 탭을 열고 인터페이스를 새로 고칩니다. 그러면 페이지에 **Hello, World!**가 표시됩니다.
Flask application output
Flask application running output
  1. / <name> 라우트의 경우 위 URL 표시줄에 직접 접미사를 추가할 수 있습니다. 예를 들어, 아래는 포트 5000 과 함께 URL 표시줄에 입력된 접미사 flask이며, 출력으로 **Hello, flask!**가 표시됩니다.

    Flask route name example
    URL 표시줄에 다른 / <name> 경로를 시도해 볼 수 있으며, 출력도 그에 따라 변경됩니다.

요약

이 랩에서는 render_template() 메서드를 사용하여 Jinja2 템플릿 엔진을 통해 템플릿을 렌더링하는 방법을 배웠습니다. 이 메서드는 템플릿을 생생하게 렌더링할 뿐만 아니라 자동 이스케이핑을 가능하게 하여 잠재적인 XSS 공격을 방지하는 데 도움이 됩니다.