1. 라우팅 개념과 중요성
Flask에서 라우팅은 웹 애플리케이션의 핵심 요소 중 하나로, 클라이언트가 특정 URL을 요청할 때 이를 처리하는 방식을 정의합니다. 라우팅의 중요성과 개념은 다음과 같습니다.
라우팅의 중요성
- 요청 처리: 라우팅은 사용자가 특정 URL로 접근할 때 해당 요청을 적절한 함수로 전달합니다. 이를 통해 다양한 페이지나 기능에 접근할 수 있게 합니다.
- URL 구조 정의: 라우팅을 통해 애플리케이션의 URL 구조를 체계적으로 설계할 수 있습니다. 이는 사용자 경험과 SEO(검색 엔진 최적화)에 중요한 역할을 합니다.
- 유지보수 용이: 명확한 라우팅 구조는 코드의 가독성과 유지보수성을 높여줍니다. 새로운 기능을 추가하거나 변경할 때 효율적으로 작업할 수 있습니다.
- 동적 콘텐츠 제공: 라우팅을 사용하여 URL 매개변수를 처리하고, 이를 기반으로 동적 콘텐츠를 제공할 수 있습니다.
라우팅의 개념
Flask에서 라우팅은 데코레이터를 사용하여 정의됩니다. @app.route() 데코레이터를 사용하여 특정 URL 패턴에 대해 특정 함수를 호출하도록 설정합니다.
기본 라우팅 예제
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return "Welcome to the homepage!"
@app.route('/about')
def about():
return "This is the about page."
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5001, debug=True)
위 예제에서:
- '/' URL은 home 함수를 호출하고, "Welcome to the homepage!" 메시지를 반환합니다.
- '/about' URL은 about 함수를 호출하고, "This is the about page." 메시지를 반환합니다.
동적 라우팅
동적 라우팅은 URL에 동적인 부분을 포함하여 다양한 입력을 처리할 수 있게 합니다.
@app.route('/user/<username>')
def show_user_profile(username):
return f'User {username}'
위 예제에서는 '/user/<username>' 패턴을 사용하여, username 부분이 동적으로 처리됩니다. 예를 들어, /user/john 요청이 들어오면 "User john"이 반환됩니다.
HTTP 메서드 지정
기본적으로 모든 라우트는 GET 요청을 처리합니다. 다른 HTTP 메서드(POST, PUT, DELETE 등)를 처리하려면 methods 매개변수를 사용합니다.
@app.route('/submit', methods=['POST'])
def submit():
return "Form submitted!"
위 예제에서는 /submit URL이 POST 요청만 처리하도록 설정되었습니다.
라우팅의 고급 기능
- URL 빌딩: url_for 함수를 사용하여 동적으로 URL을 생성할 수 있습니다. 이는 URL 변경 시 코드 수정 범위를 최소화할 수 있습니다.
- 블루프린트: 대규모 애플리케이션에서는 블루프린트를 사용하여 라우트를 모듈화 하고 조직화할 수 있습니다. 이는 코드의 재사용성과 구조화에 도움을 줍니다.
라우팅은 Flask 애플리케이션에서 매우 중요한 역할을 하며, 클라이언트의 요청을 적절히 처리하고 응답하는 데 핵심적인 기능을 담당합니다. 이해하고 활용하는 방법에 따라 애플리케이션의 유지보수성, 확장성, 사용자 경험 등이 크게 좌우됩니다.
2. Flask에서 URL 라우팅 설정
Flask에서 URL 라우팅 설정은 클라이언트가 특정 URL을 요청할 때 이를 처리하는 방법을 정의하는 것입니다. 이는 @app.route() 데코레이터를 사용하여 특정 URL 패턴에 대해 특정 함수를 호출하도록 설정하는 것을 의미합니다. 자세한 설명과 예제는 다음과 같습니다.
1) 기본 라우팅 설정
기본적으로, Flask에서는 @app.route() 데코레이터를 사용하여 URL과 이를 처리할 함수를 매핑합니다.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return "Welcome to the homepage!"
@app.route('/about')
def about():
return "This is the about page."
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5001, debug=True)
위 코드에서:
- '/' URL은 home 함수를 호출하고, "Welcome to the homepage!" 메시지를 반환합니다.
- '/about' URL은 about 함수를 호출하고, "This is the about page." 메시지를 반환합니다.
2) 동적 라우팅
동적 라우팅을 사용하면 URL의 일부를 동적으로 처리할 수 있습니다. 이를 위해 URL 패턴에 변수 부분을 포함시킵니다.
@app.route('/user/<username>')
def show_user_profile(username):
return f'User {username}'
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'Post {post_id}'
- '/user/<username>'는 username 변수를 받아 show_user_profile 함수에 전달합니다.
- '/post/<int:post_id>'는 정수형 변수 post_id를 받아 show_post 함수에 전달합니다. 3) HTTP 메서드 지정
위 예제에서 /submit URL은 POST 요청만, /update는 PUT 요청만, /delete는 DELETE 요청만 처리하도록 설정되었습니다.@app.route('/submit', methods=['POST']) def submit(): return "Form submitted!" @app.route('/update', methods=['PUT']) def update(): return "Resource updated!" @app.route('/delete', methods=['DELETE']) def delete(): return "Resource deleted!"
- 기본적으로 모든 라우트는 GET 요청을 처리합니다. 그러나 다른 HTTP 메서드(POST, PUT, DELETE 등)를 처리하려면 methods 매개변수를 사용합니다.
4) URL 빌딩
URL 빌딩을 통해 URL을 동적으로 생성할 수 있습니다. 이는 URL 구조가 변경될 경우 코드의 다른 부분에서 이를 일일이 수정할 필요를 줄여줍니다.
from flask import url_for
@app.route('/user/<username>')
def show_user_profile(username):
return f'User {username}'
@app.route('/')
def index():
return url_for('show_user_profile', username='john_doe')
위 예제에서 url_for('show_user_profile', username='john_doe')는 /user/john_doe URL을 동적으로 생성합니다.
5) 블루프린트 (Blueprint)
대규모 애플리케이션에서는 블루프린트를 사용하여 라우트를 모듈화하고 조직화할 수 있습니다.
from flask import Flask, Blueprint
app = Flask(__name__)
admin = Blueprint('admin', __name__, url_prefix='/admin')
@admin.route('/dashboard')
def admin_dashboard():
return "Admin Dashboard"
app.register_blueprint(admin)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5001, debug=True)
위 예제에서는 admin 블루프린트를 생성하고 /admin/dashboard URL을 처리하도록 설정합니다. 블루프린트는 애플리케이션의 특정 부분을 독립적으로 관리할 수 있게 해줍니다.
6) 라우트 핸들러
라우트 핸들러는 URL 요청을 처리하는 함수입니다. 이 함수는 클라이언트의 요청을 처리하고 적절한 응답을 반환합니다. 일반적으로 문자열, HTML, JSON, 또는 다른 데이터 형식을 반환할 수 있습니다.
from flask import jsonify
@app.route('/api/data')
def get_data():
data = {'key': 'value', 'number': 42}
return jsonify(data)
위 예제에서 /api/data 라우트는 JSON 형식의 데이터를 반환합니다.
이러한 라우팅 설정을 통해 Flask 애플리케이션은 다양한 URL 요청을 처리하고, 각 요청에 대해 적절한 응답을 반환할 수 있습니다. 라우팅은 Flask 애플리케이션의 핵심 기능으로, 이를 통해 클라이언트와 서버 간의 상호작용을 효과적으로 관리할 수 있습니다.
3. 동적 URL과 URL변수
Flask에서 동적 URL과 URL 변수는 사용자가 요청하는 URL에 동적인 부분을 포함하여 다양한 입력을 처리할 수 있도록 하는 기능입니다. 이를 통해 웹 애플리케이션은 사용자의 입력에 따라 다양한 결과를 제공할 수 있습니다.
동적 URL과 URL 변수의 개념
동적 URL은 URL의 일부가 변동 가능한 형태를 가지며, 이러한 부분을 URL 변수로 처리합니다. Flask에서는 URL 변수로 전달된 값을 뷰 함수의 매개변수로 사용할 수 있습니다.
동적 URL과 URL 변수의 예제
1. 기본 동적 URL
from flask import Flask
app = Flask(__name__)
@app.route('/user/<username>')
def show_user_profile(username):
return f'User {username}'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5001, debug=True)
- '/user/<username>': <username> 부분이 동적인 URL 변수입니다.
- show_user_profile(username): URL에서 추출된 username 값이 함수의 인자로 전달됩니다.
예를 들어, 사용자가 /user/john으로 접근하면 show_user_profile('john')이 호출되고 "User john"이 반환됩니다.
2. URL 변수 타입 지정
Flask에서는 URL 변수의 타입을 지정할 수 있습니다. 기본적으로 모든 URL 변수는 문자열로 처리됩니다. 타입을 지정하여 정수, 부동소수점, 경로 등으로 처리할 수 있습니다.
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'Post {post_id}'
@app.route('/price/<float:price>')
def show_price(price):
return f'Price {price}'
@app.route('/path/<path:subpath>')
def show_subpath(subpath):
return f'Subpath {subpath}'
- <int:post_id>: post_id는 정수형으로 처리됩니다.
- <float:price>: price는 부동소수점 숫자로 처리됩니다.
- <path:subpath>: subpath는 슬래시('/')를 포함한 경로로 처리됩니다.
3. URL 변수와 HTTP 메서드
URL 변수는 GET 요청뿐만 아니라 다른 HTTP 메서드와 함께 사용할 수 있습니다.
@app.route('/user/<username>', methods=['GET', 'POST'])
def user_profile(username):
if request.method == 'POST':
return f'Updating profile for {username}'
else:
return f'Viewing profile for {username}'
위 예제에서 /user/<username>는 GET과 POST 요청을 모두 처리하며, 요청 메서드에 따라 다른 응답을 반환합니다.
4. URL 변수 활용 예제
URL 변수를 활용하면 다양한 동적 콘텐츠를 제공할 수 있습니다. 예를 들어, 사용자가 입력한 정보를 기반으로 맞춤형 페이지를 제공할 수 있습니다.
from flask import Flask, request
app = Flask(__name__)
@app.route('/greet/<name>')
def greet(name):
age = request.args.get('age', default='unknown')
return f'Hello {name}, you are {age} years old.'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5001, debug=True)
- '/greet/<name>': <name>는 URL 변수입니다.
- request.args.get('age', default='unknown'): URL 쿼리 스트링에서 age 값을 추출합니다. 값이 없으면 'unknown'을 기본값으로 사용합니다.
예를 들어, 사용자가 /greet/Alice?age=30으로 접근하면 "Hello Alice, you are 30 years old."이 반환됩니다.
이와 같이 Flask에서 동적 URL과 URL 변수를 사용하면 사용자의 입력에 따라 다양한 결과를 제공할 수 있습니다. 이는 웹 애플리케이션의 유연성과 기능성을 크게 향상시킵니다.
<문제풀이 1> 이름과 나잇값을 받고 만 나이로 출력하는 코드 만들기.
from flask import Flask, request
from datetime import date
app = Flask(__name__)
def calculate_age(birth_year, birth_month, birth_day):
today = date.today()
age = today.year - birth_year - ((today.month, today.day) < (birth_month, birth_day))
return age
@app.route('/greet/<name>')
def greet(name):
try:
birth_year = int(request.args.get('birth_year', default=0))
birth_month = int(request.args.get('birth_month', default=1))
birth_day = int(request.args.get('birth_day', default=1))
age = calculate_age(birth_year, birth_month, birth_day)
return f'안녕하세요 {name}님, 만 나이는 {age}세 입니다.'
except (TypeError, ValueError):
return '잘못된 입력입니다. 생년월일을 숫자로 입력해 주세요.'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
Python 언어를 사용하는 강력한 웹 프레임워크인 Flask에 대해 깊이 있게 이해하게 되었다.
특히 Flask의 핵심 요소 중 하나인 라우팅(Routing)에 대해 배웠고 Flask를 손쉽게 익히기 위해 다양한 예제를 직접 구현해 보았다.
'Python > Flask' 카테고리의 다른 글
[Day 6] WMS(Warehouse Management System) 구성 및 요구 사항 정의 1 (2) | 2024.07.23 |
---|---|
[Day 5] 사용자 인증 시스템 구현 (0) | 2024.07.21 |
[Day 4] Database 완성 (2) | 2024.07.18 |
[Day 3] 템플릿 엔진과 HTML 렌더링 (0) | 2024.07.17 |
[Day 1] AWS Cloud EC2 based Ubuntu Linux VM building (0) | 2024.07.17 |