Python 기초 실습 C8

Python 기초 실습 C8입니다. Flask main.py, scrapper.py, templates/home.html, templates/read.html 구조와 render_template 실행 예제를 정리했습니다.

Python 기초 실습 C8: Flask 파일 구조와 template 렌더링

실습에는 main.py, templates/home.html, templates/read.html, scrapper.py 파일명이 남아 있다. 이 구조는 Flask에서 route와 template, 데이터 수집 로직을 분리하는 연습으로 볼 수 있다. 여기서는 실행 가능한 최소 Flask 예제로 정리한다.

프로젝트 구조

python-c8/
 main.py
 scrapper.py
 templates/
 home.html
 read.html

가상환경과 Flask 설치

mkdir -p python-c8/templates
cd python-c8

python3 -m venv.venv
source.venv/bin/activate
pip install --upgrade pip
pip install Flask

scrapper.py

외부 사이트를 바로 긁기보다, 먼저 데이터 처리 함수가 template과 어떻게 연결되는지 확인하는 예제로 시작한다.

def get_posts():
 return [
 {"id": 1, "title": "Linux basic", "summary": "Command practice"},
 {"id": 2, "title": "Flask template", "summary": "Render HTML with data"},
 {"id": 3, "title": "Network lab", "summary": "DNS and routing test"},
 ]


def find_post(post_id):
 for post in get_posts():
 if post["id"] == post_id:
 return post
 return None

main.py

from flask import Flask, abort, render_template
from scrapper import find_post, get_posts

app = Flask(__name__)


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


@app.get("/read/<int:post_id>")
def read(post_id):
 post = find_post(post_id)
 if post is None:
 abort(404)
 return render_template("read.html", post=post)


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

templates/home.html

<!doctype html>
<html lang="ko">
<head>
 <meta charset="utf-8">
 <title>Python C8</title>
</head>
<body>
 <h1>Post list</h1>
 <ul>
 {% for post in posts %}
 <li>
 <a href="/read/{{ post.id }}">{{ post.title }}</a>
 <p>{{ post.summary }}</p>
 </li>
 {% endfor %}
 </ul>
</body>
</html>

templates/read.html

<!doctype html>
<html lang="ko">
<head>
 <meta charset="utf-8">
 <title>{{ post.title }}</title>
</head>
<body>
 <article>
 <h1>{{ post.title }}</h1>
 <p>{{ post.summary }}</p>
 </article>
 <p><a href="/">Back</a></p>
</body>
</html>

실행

python main.py

다른 터미널에서 확인한다.

curl http://127.0.0.1:5000/
curl http://127.0.0.1:5000/read/1

마무리

이 구조의 핵심은 main.py가 route를 담당하고, scrapper.py가 데이터를 만들며, templates가 화면 출력을 담당한다는 점이다. 기능이 작을 때부터 파일 역할을 나누면 이후 실제 scraping, database, form 처리로 확장하기 쉽다.

문서 링크

BGM EVER