땅지원
땅지원's Personal blog
땅지원
전체 방문자
오늘
어제
  • 전체 (353)
    • Frontend (2)
      • React (2)
    • Backend (90)
      • Java (16)
      • Python (19)
      • Spring (23)
      • Database (21)
      • Troubleshooting (8)
    • DevOps (27)
      • ELK (13)
    • CS (40)
    • OS (2)
      • Linux (2)
    • Algorithm (95)
      • concept (18)
      • Algorithm Problem (77)
    • 인공지능 (25)
      • 인공지능 (12)
      • 연구노트 (13)
    • 수업정리 (35)
      • 임베디드 시스템 (10)
      • 데이터통신 (17)
      • Linux (8)
    • 한국정보통신학회 (5)
      • 학술대회 (4)
      • 논문지 (1)
    • 수상기록 (8)
      • 수상기록 (6)
      • 특허 (2)
    • 삼성 청년 SW 아카데미 (6)
    • 42seoul (12)
    • Toy project (3)
    • 땅's 낙서장 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 20.11.6 BB21플러스 온라인 학술대회
  • 20.10.30 한국정보통신학회 온라인 학술대회

인기 글

태그

  • ㅗ
  • E
  • I
  • 이것이 리눅스다 with Rocky Linux9
  • D

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
땅지원

땅지원's Personal blog

Backend/Python

Python Flask 웹 페이지 제작(2) - Jinja2 템플릿

2021. 12. 21. 20:03

Content

- HTML 렌더링

- 템플릿 렌더링해서 URL에 연결하기

- 템플릿에서 변수 사용하기 

- 템플릿에서 if, for 사용하기

- 템플릿 상속

HTML 렌더링

from flask import Flask

app = Flask(__name__)

@app.route('/')
@app.route('/home')
def home():
    return '''
    <h1>이건 h1 제목</h1>
    <p>이건 p 본문 </p>
    <a href="https://flask.palletsprojects.com">Flask 홈페이지 바로가기</a>
    '''
    
@app.route('/user/<user_name>/<int:user_id>')
def user(user_name, user_id):
    return f'Hello, {user_name}({user_id})!'
    
if __name__ == '__main__':
    app.run(debug=True)

return의 응답들은 텍스트, 데이터 등 다양한 형식이 될 수 있는데 일반적으로 웹 페이지에서 렌더링 할 HTML을 직접 반환하게 될 것이다.

 

템플릿 렌더링해서 URL에 연결하기

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template("index.html")

if __name__ == '__main__':
    app.run(debug=True)

위의 html자체를 렌더링 하는 것이 아닌 render_template()을 이용해서 해당 문서를 렌더링해서 반환

 

Jinja2

Flask에서 Jinja2라는 템플릿 엔진을 이용하여 애플리케이션 내 변수와 반복문, 조건문 등을 포함하는 HTML 파일을 렌더링 할 수 있다.

 

템플릿에서 변수 사용하기 (filter 기능 활용)

render_template()을 이용해서 문서를 반환하고 그 템플릿 내에서 변수를 사용하려면 

return render_template("index.html",template_students = student_data)

이와 같이 쉼표로 구분한다. 그리고 템플릿에서는 {{ 변수명 }}으로 값을 불러온다.

 

템플릿에서 if, for 사용하기

#if 조건문

{% if template_variable < 20 %}
  <p>{{ template_variable }}은 20보다 작다.</p> 
{% elif template_variable > 20 %}
   <p>{{ template_variable }}은 20보다 크다.</p> 
{% else %}
   <p>{{ template_variable }}은 20이다.</p> 
{% endif %}
#for 반복문

<ul>
{% for x in range(10) %}
    <li>{{ x }}</li>
{% endfor%}
</ul>
# dictsort 필터를 사용하고 싶을 땐 

<ul>
{% for key, value in template_dict | dictsort %}
    <li>{{ key }} : {{ value  }}</li>
{% endfor%}
</ul>

 

템플릿 상속 (Inheritance)

웹 사이트 레이아웃의 일관성(Consistency) 유지 및 header와 footer를 여러곳에 사용하기 위해서는

템플릿 상속 기능 사용 

 

● 부모문서를 만들고, 자식문서가 들어갈 부분에 {% block content %}, {% endblock %}.

● 자식문서 윗부분에 {% extends 부모문서이름 %}라고 명시한 후 {% block content %}와 % endblock %}사이에 내용을 작성한다.

# run.py

from flask import Flask, render_template

app = Flask(__name__)

student_data = {
    1: {"name": "슈퍼맨", "score": {"국어": 90, "수학": 65}},
    2: {"name": "배트맨", "score": {"국어": 75, "영어": 80, "수학": 75}}
}

@app.route('/')
def index():
    return render_template("index.html", 
            template_students = student_data)
            
@app.route("/student/<int:id>")
def student(id):
    return render_template("student.html", 
            template_name=student_data[id]["name"], 
            template_score=student_data[id]["score"])
            
if __name__ == '__main__':
    app.run(debug=True)
return render_template("index.html", template_students = student_data)

자식 html을 호출해야 부모 html까지 포함된 내용을 나타낼 수 있다.

부모 html을 호출하면 부모html의 내용만 나오게 된다.

 

<!--
base.html
부모 html
-->

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>시험성적 확인 사이트</title>
</head>
<body>
    <div>
        <a href="/">메인화면 바로가기</a>
    </div>
    {% block content %}{% endblock %}
</body>
</html>
<!--
index.html
자식 html
->

{% extends "base.html"  %}

{% block content %}
    <h1>시험 성적 확인하기</h1>
    <p>이름을 클릭하세요.</p>
    <ul>
        {% for key, value in template_students | dictsort %}
            <li><a href="/student/{{ key }}">{{ value["name"] }}</a></li>
        {% endfor%}
    </ul>
{% endblock %}
<!--
student.html
자식 html
->

{% extends "base.html"  %}
{% block content %}
    <h2>{{ template_name }} 님의 성적</h2>
    <ul>
        {% for key, value in template_score.items() %}
            <li>{{ key }} : {{ value }}</li>
        {% endfor%}
    </ul>
{% endblock %}

 

'Backend > Python' 카테고리의 다른 글

Python Thread  (0) 2021.12.28
Python Flask 웹 페이지 제작(3) - Form  (0) 2021.12.21
Python Flask 웹 페이지 제작(1) - 구조, Route  (0) 2021.12.21
Python Flask + mysql 웹 기반 어플리케이션 제작  (0) 2021.11.27
백준 코딩 연습  (0) 2021.09.27
    'Backend/Python' 카테고리의 다른 글
    • Python Thread
    • Python Flask 웹 페이지 제작(3) - Form
    • Python Flask 웹 페이지 제작(1) - 구조, Route
    • Python Flask + mysql 웹 기반 어플리케이션 제작
    땅지원
    땅지원
    신입 개발자의 우당탕탕 기술 블로그

    티스토리툴바