웹(WEB)/파이썬(Python)

[Python] Flask Router, HTTP 메서드

마달랭 2025. 1. 2. 00:26
반응형

개요

Flask에서 웹 서버의 요청을 처리하는 라우터는 클라이언트(브라우저, API 클라이언트 등)에서 보내는 HTTP 요청을 특정 함수와 연결하는 역할을한다.

라우터는 URL과 HTTP 메서드(GET, POST 등)를 기반으로 동작한다.

 

🌟 Flask 라우팅 정리

  • @app.route('/path', methods=['메서드']) 형태로 URL과 HTTP 메서드 연결.
  • Flask는 기본적으로 GET만 허용하므로, 다른 메서드는 methods에 명시해야 함.
  • 동적 라우팅(/items/<int:item_id>)을 사용해 특정 리소스를 식별할 수 있음.

 

GET

@app.route('/items', methods=['GET'])
def get_items():
    items = Item.query.all()
    return jsonify([{'id': item.id, 'name': item.name} for item in items])

 

  • 클라이언트가 서버에서 리소스를 조회할 때 사용
  • URL을 통해 데이터를 전달하고, 서버는 해당 데이터나 페이지를 반환
  • 주로 조회, 리스트 출력 등의 용도로 사용

위 코드는 /items URL로 GET 요청이 오면, 데이터베이스에서 모든 항목을 조회해 JSON으로 반환한다.

 

 

POST

 

@app.route('/items', methods=['POST'])
def create_item():
    data = request.json
    new_item = Item(name=data['name'], description=data['description'])
    db.session.add(new_item)
    db.session.commit()
    return jsonify({'message': 'Item created'}), 201

 

  • 서버에 데이터를 생성할 때 사용
  • 클라이언트가 요청 본문(body)에 데이터를 담아 전송하고, 서버는 이를 처리해 새로운 리소스를 생성
  • 이 코드는 클라이언트가 새로운 항목을 생성하는 API로, 요청 본문에서 데이터를 읽고 데이터베이스에 추가함

 

 

PUT

@app.route('/items/<int:item_id>', methods=['PUT'])
def update_item(item_id):
    data = request.json
    item = Item.query.get(item_id)
    if not item:
        return jsonify({'message': 'Item not found'}), 404
    
    item.name = data['name']
    item.description = data['description']
    db.session.commit()
    return jsonify({'message': 'Item updated'})

 

  • 리소스를 전체 수정할 때 사용
  • 기존 데이터를 새 데이터로 완전히 덮어씀
  • 업데이트 시 모든 필드를 전송해야 함

 

PATCH

 

@app.route('/items/<int:item_id>', methods=['PATCH'])
def patch_item(item_id):
    data = request.json
    item = Item.query.get(item_id)
    if not item:
        return jsonify({'message': 'Item not found'}), 404
    
    if 'name' in data:
        item.name = data['name']
    if 'description' in data:
        item.description = data['description']
    db.session.commit()
    return jsonify({'message': 'Item partially updated'})

 

 

  • 리소스를 부분 수정할 때 사용
  • PUT과 비슷하지만, 변경할 데이터만 전송함
  • 일부 필드만 수정하고 나머지는 그대로 유지됨
  • 클라이언트가 name 또는 description 중 일부만 수정하고 싶을 때 사용

 

 

DELETE

@app.route('/items/<int:item_id>', methods=['DELETE'])
def delete_item(item_id):
    item = Item.query.get(item_id)
    if not item:
        return jsonify({'message': 'Item not found'}), 404
    
    db.session.delete(item)
    db.session.commit()
    return jsonify({'message': 'Item deleted'})
  • 리소스를 삭제할 때 사용
  • 특정 ID나 조건에 맞는 데이터를 삭제함
 

여러 메서드를 한 라우터에 설정하는 경우

@app.route('/items', methods=['GET', 'POST'])
def handle_items():
    if request.method == 'GET':
        return get_items()
    elif request.method == 'POST':
        return create_item()
  • 하나의 URL에서 여러 메서드를 지원할 수도 있다.
  • 위와 같이 GET과 POST를 같은 엔드포인트에서 처리 가능

 

728x90
반응형