TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 웹개발>

[파이썬] 플라스크(Flask) - RESTful API

by 기록자_Recordian 2024. 7. 21.
728x90
반응형
시작에 앞서
해당 내용은 <가장 빠른 풀스택을 위한 Flask & FastAPI>, Dave Lee 지음. BJ Public 출판.
내용을 토대로 작성되었습니다. 보다 자세한 사항은 해당 교재를 참고하시기 바랍니다.

RESTful API

 

RESTful API는 컴퓨터나 스마트폰 애플리케이션(클라이언트)이 서버에 정보를 요청하거나 보낼 수 있는 방법 중 하나이다.

이는 주로 웹사이트나 애플리케이션에서 다양한 서비스를 이용할 때 중요한 역할을 한다.

★ 서버: 정보가 저장된 컴퓨터

★ 클라이언트: 서버에 저장된 정보를 사용하려는 사람이나 애플리케이션


HTTP 메서드 이해하기

 

HTTP 메서드: 서버와 클라이언트가 어떻게 대화할 것인지를 정해 놓은 규칙

 

[주요 명령어]

  • GET(조회): 클라이언트가 서버에게 "이 정보 좀 줘"라고 '요청하는' 것 (웹 브라우저에서 웹페이지를 열 때, 서버에게 그 페이지의 정보를 가져오라는 요청을 하는 것)
  • POST(생성): 클라이언트가 서버에게 새로운 정보를 '보내는' 것 (새 글을 올릴 때 그 글의 내용을 서버에 올리라는 요청을 하는 것)
  • PUT(수정): 이미 서버에 있는 정보를 '바꾸는' 것 (웹페이지에 올린 글의 내용을 수정하면 그 수정된 내용을 서버에 바꾸라는 요청을 하는 것)
  • DELETE(삭제): 서버에 있느 정보를 '지우는' 것 (웹페이지의 글을 삭제하면 그 글을 서버에서 지우라는 요청을 하는 것)

RESTful API 구현하기

 

플라스크에서는 app.route라는 데코레이터를 사용해 각각의 HTTP 메서드에 맞는 함수를 지정한다.

★ 데코레이터: 함수의 기능을 확장해주는 코드 조각

 

각각의 HTTP 메서드에 따라 다른 작업을 수행할 수 있도록 플라스크에서는 app.route 데코레이터와 request.method 변수를 제공한다.

from flask import Flask, request

app = Flask(__name__)

@app.route('/user', methods=['GET', 'POST'])
def manage_user():
    if request.method == 'GET':
        # GET 요청 처리 로직
        return "User data"
    elif request.method == 'POST':
        # POST 요청 처리 로직
        return "Create user"

▶ 각 코드별 의미

- 플라스크 모듈: 웹 서버의 기능 담당

- request 모듈: 클라이언트의 요청을 처리

- methods=['GET', 'POST'] : URL 경로(/user)에서 어떤 HTTP 메서드(GET, POST 등)를 처리할 것인지 명시(기본은 GET)

- request.method: 클라이언트로부터 들어온 HTTP 메서드가 무엇인지를 알려주는 변수

이 변수를 이용해 조건문(if, elif)을 작성하면 들어온 요청이 GET인지, POST 인지에 따라 다른 로직을 실행할 수 있다.

GET 요청: 함수는 "User data"라는 문자열 반환 (데이터베이스에서 사용자 정보를 가져와 반환하는 로직이 들어갈 수 있다)

POST 요청: "Create user" 라는 문자열 반환(데이터베이스에 새로운 사용자를 생성하는 로직 필요) 

 

◆ PUT과 DELETE 메서드를 처리하는 방법

from flask import Flask, request

app = Flask(__name__)

@app.route('/user', methods=['GET', 'POST'])
def manage_user():
    if request.method == 'GET':
        # GET 요청 처리 로직
        return "User data"
    elif request.method == 'POST':
        # POST 요청 처리 로직
        return "Create user"
    elif request.method == "PUT":
        # PUT 요청 처리 로직
        return "Update user"
    elif request.method == "DELETE":
        # DELETE 요청 처리 로직
        return "Delete user"

PUT 요청: "Update user"라는 문자열 반환. (데이터베이스의 특정 사용자 데이터를 수정하는 로직이 들어간다)

DELETE 요청: "Delete user"라는 문자열 반환. (데이터베이스에서 특정 사용자를 삭제하는 로직이 들어간다)

 

http://127.0.0.1:5000/user 에 접속하면 "User data" 라는 응답을 받는다.

 

◆ HTTP 메서드와 curl 명령어

터미널에서 하단의 명령어를 입력하여 각각의 요청을 받는다.

 

- GET 요청

curl -X GET http://127.0.0.1:5000/user

 

- POST 요청

curl -X POST http://127.0.0.1:5000/user

 

- PUT 요청

curl -X PUT http://127.0.0.1:5000/user

 

- DELETE 요청

curl -X DELETE http://127.0.0.1:5000/user

 

▶ 실제 애플리케이션에서는 데이터를 함께 전송하거나 헤더를 설정하는 등 더 복잡한 요청이 필요할 수 있다.

예) JSON 형식 데이터 전송 시,

curl -H "Content-Type:application/json" 헤더를 추가하고 -d 옵션으로 데이터 전달


◆ jsonify

jsonify는 플라스크 라이브러리에서 제공하는 함수로, 파이썬의 기본 자료형은 JSON 형태로 변환해주고 HTTP 응답을 반환한다.
API에서 클라이언트에게 JSON 데이터를 응답으로 보낼 때 많이 사용된다.

  • 데이터 타입 변환: 파이썬의 딕셔너리, 리스트, 튜플 등을 JSON 형태로 쉽게 변환
  • HTTP 응답: MIME 타입을 application/json 으로 설정한 상태에서 HTTP 응답을 반환

해당 코드를 app.py로 저장한 후 flask run 실행하여 

http://127.0.0.1:5000/api로 접속하면

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/api')
def my_api():
    my_dict = {"name": "John", "age": 30, "city": "New York"}
    return jsonify(my_dict)

▶ my_dict 딕셔너리가 JSON 형태로 변환되어 반환된다.

 

jsonify 는 플라스크 개발에서 굉장히 편리하게 사용되는 함수로, API 응답을 간결하고 명확하게 만든다.


예제로 이해하는 RESTful API

 

아래 코드는 사용자 데이터(user_data)를 관리하기 위한 간단한 RESTful API 예제이다.

GET, POST, PUT, DELETE 네 가지 HTTP 메서드를 사용하여 데이터를 조회, 생성, 수정, 삭제 한다.

from flask import Flask, request, jsonify

app = Flask(__name__)
user_data = {} # 딕셔너리로 사용자 데이터 저장

@app.route('/user/<username>', methods=['GET', 'POST', 'PUT', 'DELETE'])
def manage_user(username=None):
    global user_data #전역 변수 user_data 사용

    if request.method == 'GET':
        # GET 요청 처리 로직
        return jsonify({username: user_data.get(username, "Not Found")})
    
    elif request.method == 'POST':
        # POST 요청 처리 로직
        new_data = request.json # JSON 형태의 데이터 받음
        user_data[username] = new_data
        return jsonify(new_data), 201
    
    elif request.method == "PUT":
        # PUT 요청 처리 로직
        update_data = request.json
        if username in user_data:
            user_data[username].update(update_data)
            return jsonify(update_data)
        else:
            return jsonify({"error": "username not found"}), 404
    
    elif request.method == "DELETE":
        # DELETE 요청 처리 로직
        if username in user_data:
            del user_data[username]
            return jsonify({"result": "deleted"}), 200
        else:
            return jsonify({"error": "username not found"}), 404

 

▶ curl로 테스트하기

-X 옵션: 사용할 HTTP 메서드 지정

-H 옵션: 헤더 설정

-d 옵션: POST나 PUT 과 같이 데이터를 전송할 때 사용

 

- POST: 새 사용자 생성

curl -X POST -H "Content-Type: application/json" -d"{\"username\":\"john\"}" http://127.0.0.1:5000/user/john

 

- GET: 데이터 조회

curl -X GET http://127.0.0.1:5000/user/john

 

- PUT: 데이터 수정

curl -X PUT -H "Content-Type: application/json" -d"{\"age\":31}" http://127.0.0.1:5000/user/john

 

- DELETE: 데이터 삭제

curl -X DELETE http://127.0.0.1:5000/user/john

 

728x90
반응형