본문 바로가기
파이썬 웹 프로그래밍 기본

4. 웹 페이지 - 4.1. 템플릿(template) 엔진

by 영바이트 2020. 8. 16.

Hello Flask 예제를 통해 하나의 파일로 이루어진 웹 서버를 실행시키고 웹 브라우저를 이용해서 요청과 응답을 주고받았다. 몇 가지 핵심 기능만 제공하는 웹 서비스는 하나의 파일을 이용해서 충분히 기능을 제공할 수 있다.

 

하지만 여러 페이지로 구성되어 있는 웹 서비스는 각각의 페이지를 서로 다른 파일로 분리하면 유지와 보수가 편리하다. 더불어 페이지의 내용들이 자주 바뀌는 경우 프로그램으로 데이터를 읽어서 페이지에 해당 데이터를 변경할 수 있으면 더 편리하다.

 

플라스크는 웹 페이지 관리와 페이지 생성 기능을 제공한다. 이를 템플릿(template) 엔진(engine)이라고 하는데 어떻게 사용할 수 있는지 먼저 예제를 통해 살펴보자.

 

실습을 위해 만들었던 WebPythonFlask 프로젝트 아래에 02_template을 이름으로 디렉토리(=폴더)를 생성하고 다시 이 02_template 디렉토리 아래에 static, templates 라는 이름으로 두 개의 디렉토리를 생성하자.

 

<02_template 실습 디렉토리 생성>

 

먼저 templstes 디렉토리 아래에 아래의 세 파일들을 생성하고 내용을 입력하자.

 

02_template/templates/layout.html

<!DOCTYPE html>
    <head>
        <meta charset="utf-8">
        <link rel="stylesheet" type="text/css" href="{{url_for('static', filename='main.css')}}">
        {%if title%}
            <title>{{title}}</title>
        {%else%}
            <title>Flask Exercise</title>
        {%endif%}
    </head>
    <body>
        <a href="/">Home</a>
        <a href="/about">About</a>
        <div>
            <a href="/login">Login</a>
            <a href="/register">Register</a>
        </div>
        <div>
            {%block content%}{%endblock content%}
        </div>
    </body>
</html>

 

02_template/templates/about.html

{%extends "layout.html"%}
{%block content%}
    <h1>About Page</h1>
{%endblock content%}

 

02_template/templates/home.html

{%extends "layout.html"%}
{%block content%}
    {%for post in posts%}
        <h1>{{post.title}}</h1>
        <p>{{post.content}}</p>
        <p>By {{post.author}} on {{post.datePosted}}</p>
    {%endfor%}
{%endblock content%}

 

다음으로 static 디렉토리 아래에 main.css 파일을 생성하고 그 내용은 비워놓는다. CSS파일은 웹 페이지 요소들의 배치와 모양을 지정하는 파일이다. 예제에서는 웹 페이지를 구성하는 요소들의 모양이나 배치와 같은 디자인 측면은 필요 없기 때문에 비워놓았다.

 

02_template/static/main.css

   
   
   

 

마지막으로 02_template 디렉토리 아래에 template.py라는 이름으로 파이썬 스크립트 파일을 생성하고 아래 내용을 입력하자.

 

02_template/template.py

from flask import Flask, render_template, url_for

app = Flask(__name__)

posts = [
    {
        'author': 'Elsa',
        'title': 'Blos post 1',
        'content': 'The first posting',
        'datePosted': 'August 16, 2020'
    },
    {
        'author': 'Anna',
        'title': 'Blos post 2',
        'content': 'The second posting',
        'datePosted': 'August 17, 2020'
    }
]

@app.route("/")
@app.route("/home")
def home():
    return render_template("home.html", posts = posts)

@app.route("/about")
def about():
    return render_template("about.html", title = 'About')

if __name__ == "__main__":
    app.run("127.0.0.1", 5000)

 

아래 그림과 같이 디렉토리와 파일들이 준비되었을 것이다.

 

<02_template 프로젝트 전체 파일들>

 

이제 프로젝트 메인 스크립트 template.py를 실행시키고 웹 브라우저를 이용해 127.0.0.1:5000 주소로 접근해보자. 먼저 아래와 같이 홈 페이지가 나타날 것이다.

 

<프로젝트 메인 파일 template.py 실행>

 

<127.0.0.1:5000/>

 

Login 링크를 클릭해서 로그인 페이지로 이동하면 아래와 같이 페이지를 찾을 수 없다는 메시지가 표시될 것이다. 아직 로그인 페이지를 만들지 않았으므로 정상적인 응답이다.

 

<127.0.0.1:5000/login>

 

예제에서는 웹 페이지를 구성하는 각각의 페이지들을 서로 다른 파일로 구분하였다. 더불어 데이터를 읽어서 웹 페이지 내용을 채우는 기능도 구현해보았다. 이어지는 글에서 코드가 어떻게 동작하는지 분석해 보도록하겠다.

댓글