![[파이썬 19] 파이썬으로 간단한 웹앱 만들기, Flask](https://img.thenullpage.com/posts/5398/5398_3_ef2140.webp)
지금까지는 터미널 안에서만 돌아가는 스크립트를 다뤘다면, 이번엔 웹 브라우저로 접속해서 쓸 수 있는 웹앱을 만들어본다. Flask는 파이썬의 대표적인 경량 웹 프레임워크로, 라우팅(URL 처리), 템플릿 렌더링, 개발용 서버까지 최소한의 구성으로 웹 애플리케이션을 만들 수 있게 해준다.
1. 설치와 첫 웹앱
pip install Flask
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return "안녕하세요, 첫 Flask 앱입니다!"
if __name__ == "__main__":
app.run(debug=True)
이 코드를 app.py로 저장하고 실행하면 http://127.0.0.1:5000/에서 웹페이지가 뜬다. @app.route('/')는 데코레이터라는 문법으로, 특정 URL(여기선 루트 주소 /)에 접속했을 때 어떤 함수를 실행할지 연결해주는 역할을 한다.
debug=True 옵션은 개발 중 오류가 나면 브라우저 화면에 상세한 오류 내용을 보여줘서 디버깅을 편하게 해주지만, 실제 서비스로 배포할 때는 보안상 반드시 꺼야 하는 옵션으로 강조된다.
2. 여러 페이지(라우트) 만들기
@app.route('/about')
def about():
return "이 페이지는 소개 페이지입니다."
@app.route('/hello/<name>')
def hello(name):
return f"안녕하세요, {name}님!"
URL 경로에 <name>처럼 꺾쇠괄호를 쓰면 그 부분이 변수로 함수에 전달된다. 예를 들어 /hello/철수로 접속하면 "안녕하세요, 철수님!"이 출력되는 식으로, URL 자체가 동적인 값을 받을 수 있게 된다.
3. HTML 템플릿으로 화면 꾸미기
문자열만 반환하는 대신 실제 HTML 페이지를 보여주려면 템플릿 기능을 쓴다. 프로젝트 폴더 안에 templates라는 폴더를 만들고 그 안에 HTML 파일을 넣으면 된다.
html
<!-- templates/index.html -->
<!DOCTYPE html>
<html>
<body>
<h1>{{ message }}</h1>
</body>
</html>
from flask import render_template
@app.route('/')
def home():
return render_template('index.html', message='환영합니다!')
{{ message }}처럼 이중 중괄호로 감싼 부분은 Jinja2라는 템플릿 엔진 문법으로, 파이썬에서 넘겨준 값이 그 자리에 그대로 채워진다. 앞서 배운 반복문도 템플릿 안에서 그대로 쓸 수 있어서, 리스트 데이터를 순회하며 화면에 목록을 출력하는 것도 가능하다.
4. 폼 데이터 받기, 사용자 입력 처리
사용자가 입력한 값을 서버가 받아 처리하려면 GET과 POST라는 두 가지 요청 방식을 구분해서 다뤄야 한다.
from flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
name = request.form['username']
return f"{name}님, 환영합니다"
return render_template('login.html')
methods=['GET', 'POST']는 이 라우트가 두 방식 모두 처리할 수 있다는 뜻이다. 사용자가 처음 페이지에 접속할 땐 GET(폼을 보여주는 용도), 폼을 제출할 땐 POST(입력값을 서버로 전송)로 구분해서 로직을 나누는 것이 일반적인 패턴이다.
5. 이전 편들과 연결하기, 실전 아이디어
Flask는 지금까지 배운 여러 자동화 기능과 결합하기 좋다. 예를 들어 크롤링해온 데이터를 웹페이지로 보여주거나, ChatGPT/Claude API 응답을 받아 웹 화면에 표시하는 간단한 챗봇 웹사이트를 만들 수도 있다. 실제로 API 응답을 받아 JSON으로 반환하는 엔드포인트도 몇 줄이면 만들 수 있다.
import anthropic
client = anthropic.Anthropic()
@app.route('/chat', methods=['POST'])
def chat():
user_message = request.json.get('message')
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": user_message}]
)
return {"reply": response.content[0].text}
6. 정리
Flask는 라우트(URL 처리), 템플릿(HTML 렌더링), 폼 처리라는 세 가지 요소만 이해하면 기본적인 웹앱을 만들 수 있다. 지금까지 배운 크롤링, API 호출, 데이터 처리 같은 기능들을 Flask 라우트 안에 넣으면 그대로 웹 서비스로 확장할 수 있다는 점이 핵심이다.