[파이썬 19] 파이썬으로 간단한 웹앱 만들기, Flask


지금까지는 터미널 안에서만 돌아가는 스크립트를 다뤘다면, 이번엔 웹 브라우저로 접속해서 쓸 수 있는 웹앱을 만들어본다. 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 라우트 안에 넣으면 그대로 웹 서비스로 확장할 수 있다는 점이 핵심이다.