기술블로그
Flask에서 url_for를 사용한 리디렉션 with 파머(2/3)
Chansman
2025. 4. 22. 14:41
Flask에서 url_for를 사용한 리디렉션
url_for 함수는 Flask에서 URL을 동적으로 생성할 수 있는 중요한 도구입니다. 이를 사용하면 함수의 이름을 기반으로 URL을 생성하므로, URL이 변경되더라도 코드 내에서 하드코딩된 URL을 수정할 필요 없이 쉽게 수정할 수 있습니다. 특히 리디렉션에서 유용하게 사용됩니다.
코드 설명
1. 기본 Flask 애플리케이션
from flask import Flask, render_template, url_for, redirect
app = Flask(__name__)
@app.route('/home123')
def home():
return "Home Page"
- 홈 페이지 라우트 (/home123): 이 라우트는 /home123 URL에 접근했을 때 "Home Page" 메시지를 반환합니다.
2. 리디렉션 예시 (/go-home)
python
복사
@app.route('/go-home') def go_home(): return redirect('/home123') # 변경된 주소값을 넣어줘야 됨
@app.route('/go-home')
def go_home():
return redirect('/home123') # 변경된 주소값을 넣어줘야 됨
- 리디렉션: /go-home으로 접근하면, 이 라우트는 사용자에게 /home123으로 리디렉션을 합니다. 만약 URL이 변경되면 이 부분도 수동으로 수정해야 합니다.
3. URL 변경에 대한 해결책 (url_for 사용)
@app.route('/go-home')
def go_home():
return redirect(url_for('home')) # 함수 이름을 넣으면 URL이 변경되어도 동적으로 처리
- url_for 사용: url_for('home')는 home 뷰 함수에 해당하는 URL을 자동으로 생성합니다. 만약 /home123 라우트가 다른 주소로 변경되더라도, url_for('home')를 통해 항상 해당 라우트의 URL을 자동으로 참조할 수 있습니다. 이로 인해 URL을 하드코딩하는 문제를 피할 수 있습니다.
4. 중복된 라우트 정의 (오류)
@app.route('/go-home')
def go_home():
return redirect(url_for('home')) # 함수 이름을 넣으면 URL이 변경되어도 동적으로 처리
- 위의 코드에서 **@app.route('/go-home')**가 두 번 선언되어 있습니다. Flask에서는 라우트가 중복될 수 없습니다. 하나의 라우트만 정의해야 하므로, 중복되는 라우트는 삭제해야 합니다.
수정된 코드
from flask import Flask, render_template, url_for, redirect
app = Flask(__name__)
# 홈 페이지 라우트
@app.route('/home123')
def home():
return "Home Page"
# go-home 페이지 라우트 (리디렉션)
@app.route('/go-home')
def go_home():
return redirect(url_for('home')) # url_for를 사용하여 동적으로 리디렉션
# 로그아웃 페이지 라우트 (리디렉션)
@app.route('/logout-home')
def logout_home():
return redirect(url_for('home')) # url_for를 사용하여 동적으로 리디렉션
if __name__ == '__main__':
app.run(debug=True)
HTML 템플릿 (index.html)
이 템플릿은 사용자에게 동적으로 표시할 정보를 출력합니다. 예를 들어, name_index라는 변수를 받아서 출력합니다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>안녕하세요, 반가워요, 또 만났네요 {{ name_index }}</h1>
</body>
</html>
- {{ name_index }}는 Flask에서 render_template를 사용할 때 전달된 변수 name_index의 값을 출력합니다. 예를 들어, 라우트에서 name_index 값을 넘겨주면 이 값이 템플릿에 출력됩니다.
요약
- url_for: URL을 하드코딩하지 않고, Flask의 라우트 함수 이름을 기반으로 동적으로 URL을 생성합니다. 이를 통해 URL이 변경되더라도 코드 내에서 자동으로 반영됩니다.
- 리디렉션: redirect()와 url_for()를 사용하여 다른 URL로 리디렉션할 수 있으며, URL이 변경되더라도 리디렉션 코드에서 변경을 최소화할 수 있습니다.
- 중복된 라우트 정의 제거: 동일한 URL에 대해 중복된 라우트 정의는 에러를 발생시킬 수 있습니다. 하나의 URL에 대해 한 개의 라우트만 정의해야 합니다.
검색
ChatGPT는 실수를 할 수 있습니다. 중요한 정보는 재차 확인하세요.