기술블로그

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는 실수를 할 수 있습니다. 중요한 정보는 재차 확인하세요.