Flask에서 url_for와 라우트 사용
Flask 애플리케이션에서 **url_for**와 라우트 설정의 역할을 설명하는 코드입니다. 이 코드는 여러 가지 라우트를 설정하고 url_for을 사용하여 동적으로 URL을 생성하는 방법을 보여줍니다.
전체 코드
from flask import Flask, render_template, url_for
app = Flask(__name__) # Flask 애플리케이션 객체 생성
# 기본 홈 라우트
@app.route('/')
def index():
return "안녕하세요, 반가워요, 또 만났네요"
# 여러 메서드를 처리하는 라우트 예시
@app.get("/hello")
@app.post("/hello")
def hello():
return "방문해주셔서 감사합니다."
# /hello 엔드포인트에 GET과 POST 요청을 처리하는 라우트
@app.route('/hello', methods=['GET', 'POST'], endpoint="hello-endpoint")
def hello():
return "방문해주셔서 감사합니다."
# 동적 URL 처리 예시
@app.route('/hello/<int:name>', methods=['GET', 'POST'], endpoint="hello-endpoint")
def hello(name):
return f"방문해주셔서 감사합니다. {name}"
# 이름을 받아서 템플릿에 전달하는 라우트
@app.route("/name/<name>")
def show_name(name):
return render_template("index.html", name_index=name)
# URL을 동적으로 생성하여 테스트하는 부분
with app.test_request_context(): # 가짜 요청을 보내기 위해 사용
print(url_for("index")) # '/' 출력
print(url_for('hello-endpoint', name="12345")) # '/hello/12345' 출력
if __name__ == '__main__':
app.run(debug=True)
주요 부분 설명
1. 기본 홈 라우트 (/)
@app.route('/')
def index():
return "안녕하세요, 반가워요, 또 만났네요"
- 라우트 설명: 애플리케이션의 홈 페이지에 대한 라우트입니다. 사용자가 / URL로 접속하면 이 함수가 호출되어 "안녕하세요, 반가워요, 또 만났네요"라는 메시지를 반환합니다.
2. 여러 메서드 처리 예시 (@app.get, @app.post)
@app.get("/hello")
@app.post("/hello")
def hello():
return "방문해주셔서 감사합니다."
- 라우트 설명: 이 라우트는 GET과 POST 메서드 모두에 대응하는 라우트입니다. /hello URL에 대해 GET 요청 또는 POST 요청이 들어오면, "방문해주셔서 감사합니다."라는 메시지를 반환합니다.
- Flask 2.0에서 사용 가능: Flask 2.0 이상에서는 @app.get()과 @app.post() 데코레이터를 사용하여 HTTP 메서드별 라우트를 지정할 수 있습니다.
3. URL 매핑 (@app.route)
@app.route('/hello', methods=['GET', 'POST'], endpoint="hello-endpoint")
def hello():
return "방문해주셔서 감사합니다."
- 라우트 설명: 이 라우트는 /hello URL에 대해 GET과 POST 메서드를 처리합니다. 해당 URL로 요청이 오면 "방문해주셔서 감사합니다."라는 메시지를 반환합니다.
- endpoint: 이 속성은 Flask 내부에서 URL을 처리하는 함수의 고유 이름을 정의합니다. url_for('hello-endpoint')와 같이 이 엔드포인트를 참조할 수 있습니다.
4. 동적 URL 처리
@app.route('/hello/<int:name>', methods=['GET', 'POST'], endpoint="hello-endpoint")
def hello(name):
return f"방문해주셔서 감사합니다. {name}"
- 동적 URL: <int:name>는 동적 변수로, URL에서 name 부분을 정수값으로 받아올 수 있습니다.
- 예를 들어, /hello/12345로 요청을 보내면, name은 12345가 되어, "방문해주셔서 감사합니다. 12345"라는 메시지를 반환합니다.
5. render_template를 사용한 템플릿 렌더링
@app.route("/name/<name>")
def show_name(name):
return render_template("index.html", name_index=name)
- render_template: 이 함수는 index.html 템플릿을 렌더링하고, name_index라는 변수를 템플릿에 전달합니다.
- 템플릿에서 name_index를 사용하여 전달된 name 값을 출력할 수 있습니다.
6. url_for 함수 사용
with app.test_request_context():
print(url_for("index")) # '/'
print(url_for('hello-endpoint', name="12345")) # '/hello/12345'
- url_for: 이 함수는 라우트에 대한 URL을 동적으로 생성합니다.
- url_for("index")는 index 함수가 매핑된 URL을 반환합니다. 이 경우 '/'가 반환됩니다.
- url_for('hello-endpoint', name="12345")는 hello-endpoint로 정의된 URL을 생성하고, name 변수에 "12345" 값을 넣어서 /hello/12345 URL을 반환합니다.
7. HTML 파일 예시 (index.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Show Name</title>
</head>
<body>
<h1>Name : {{ name_index }}</h1>
</body>
</html>
- name_index: 이 값은 show_name 라우트에서 전달한 name_index 값을 출력합니다.
- 예를 들어, URL이 /name/John이면 John이 출력됩니다.
결론
- url_for: Flask에서 URL을 동적으로 생성할 수 있게 해주는 중요한 함수입니다. 이를 사용하면 URL을 하드코딩하지 않고, 함수 이름을 기반으로 URL을 생성할 수 있어 유지보수와 코드 재사용성이 좋아집니다.
- 동적 URL: <int:name>와 같은 동적 URL을 사용하여, URL 경로에서 변수를 받아 다양한 동작을 할 수 있습니다.
- Flask 라우트: @app.route를 사용하여 URL을 정의하고, 이 URL에 대응하는 뷰 함수를 작성하여 웹 페이지나 API 엔드포인트를 만듭니다.
'기술블로그' 카테고리의 다른 글
Flask에서 애플리케이션에서 동적 라우트와 조건부 템플릿 사용 with 파머(3/3) (0) | 2025.04.22 |
---|---|
Flask에서 url_for를 사용한 리디렉션 with 파머(2/3) (0) | 2025.04.22 |
Flask-Smorest의 응답 처리 방식 (0) | 2025.04.18 |
Flask의 기능 + Blueprint + Flask-Smorest 통한 작업섹션 구분 (0) | 2025.04.18 |
Blueprint 이름은 Flask 내부에서 라우트와 뷰 함수를 구분하는 데 사용된다 (0) | 2025.04.18 |