시작에 앞서
해당 내용은 <가장 빠른 풀스택을 위한 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
'[파이썬 Projects] > <파이썬 웹개발>' 카테고리의 다른 글
[파이썬] 플라스크(Flask) - 배포(Deployment) (2) | 2024.07.22 |
---|---|
[파이썬] 플라스크(Flask) - 캐싱(caching) (0) | 2024.07.21 |
[파이썬] 플라스크(Flask) - 인증과 세션(2) (0) | 2024.07.21 |
[파이썬] 플라스크(Flask) - 인증과 세션(1) (3) | 2024.07.20 |
[파이썬] 플라스크(Flask) - 데이터베이스 (3) (2) | 2024.07.20 |