API 개발/Restful API

Restful API : Python flask 에서, API 개발을 위해 Resource 클래스를 개발하는코드 (post : body의 json을 받아서 처리하는 방법)

신강희 2024. 5. 22. 02:02
728x90

< Python flask 에서, API 개발을 위해 Resource 클래스를 개발하는코드 (post : body의 json을 받아서 처리하는 방법) >

 

# Class란 변수와 함수로 구성된 묶음 으로 상속이 가능한데, API를 만들기 위해서 flask_restful 라이브러리의 Resource class 상속해서 만들어야 한다!

# recipe.py라는 파일을 생성하여 API를 처리하는 함수 개발(HTTP Method를 보고 동일한 형식으로 만들어준다.)

 
# 우선 코드 작성에 필요한 라이브러리를 import
from flask import request
from flask_restful import Resource
 
# MySQL DB와 연동하기 위한 라이브러리
from mysql_connection import get_connection
from mysql.connector import Error
 
# 클래스 생성! 파라미터에는 Resource를 입력해준다. (상속 받기 위해)
class RecipeListResource(Resource) :
    # 레시피를 생성하는 API 파라미터에는 self를 입력해준다.
    def post(self) :

        # 1. 클라이언트가 보내준 데이터가 있으면
        #    그 데이터를 받아준다.

        data = request.get_json()

        # 2. 이 정보를 DB에 저장한다. (MySQL 커넥터를 사용하는 순서)
        try :
            ### 1. DB에 연결
            connection = get_connection()

            ### 2. 쿼리문 만들기
            ### 쿼리문을 만들때는 MySQL Workbench에서 먼저 테스트를 한후에 복사해서 붙여넣어 준다!
             query = '''insert into recipe
                    (name, description, num_of_servings, cook_time, directions)
                    values
                    ( %s, %s, %s, %s, %s );'''

            ### 3. 쿼리에 매칭되는 변수 처리 => 튜플로!!
            record = (data['name'], data['description'], data['num_of_servings'], data['cook_time'], data['directions'])

            ### 4. 커서를 가져온다.
            cursor = connection.cursor()

            ### 5. 쿼리문을 커서로 실행한다.
            cursor.execute(query, record)

            ### 6. DB에 완전히 반영하기 위해서는 commit 한다.
            connection.commit()

            ### 7. 자원 해제
            cursor.close()
            connection.close()

         # 에러 발생시 에러 내용을 표시
        except Error as e :
            if cursor is not None :
                cursor.close()
            if connection is not None :
                connection.close()
            return {'result' : 'fail' , 'error' : str(e)}, 500
        # API를 끝낼때는 클라이언트에 보내줄 정보(json)와 http 상태코드를 보내준다! (리턴한다)
        return {'result' : 'success'}, 200
 

 

# 이렇게 작성한 코드를 이전 게시글에서 작성하였던 연결코드로 app.py 파일에서 연결 시키는것!

 
# 생성한 API class 사용을위해서 생성시마다 import 필요!
from resources.recipe import RecipeListResource
 
# 경로(path)와 리소스(API 코드)를 연결한다.
# <int> flask 문법임 외워야됨
api.add_resource( RecipeListResource , '/recipes')
 

 

# 테스트는 postman을 사용하여 실행해볼수 있다.

# 과정이 조금 복잡한데, 사용하는 툴을 정리해 보자면,

 

1) DB 연결을 위해서 사전에 MySQL Workbench에서 전용 DB를 생성하여 놓고,
2) Anaconda 프롬포트에서 가상환경 세팅을 하고 Git을 활용해서 VScoed 실행
3) VSCode에서 필요한 라이브러리를 설치해주고, 생성한 가상환경으로 맞춘후 파일 생성
4) 이제 postman을 실행해서 Add request를 용도에 맞게 HTTP Method 형식을 선택해서 알맞은 경로로 만들고 필요시엔 Body문(json) 작성후에 send (코드문 작성전에 request를 먼저 생성하여서 로직을 우선 짜야한다!)

5) 코드문을 작성하면서 중간에 쿼리문 작성을 위해 MySQL Workbench서 쿼리문 테스트! 코드 생성이 완료되었으면 VSCode에 terminal 활용해서 서버 실행 flask run
6) postman과 VSCode 터미널에 정상적으로 실행 문구 출력되는지 확인!

 

# 우선 그럼 recipe라는 주제로 생성하는 API를 작성하였고, 해당 기능에 맞는 request도 생성하여 주자!

# postman 설치가 되어 있지 않다면 참고 (https://sorktjrrb.tistory.com/131)

 

1) Add request로 생성하여, 용도에 맞게 HTTP 요청 메소드(GET, POST, PUT, DELETE 등)를 설정하고, 경로(URL) 작성!

2) 이때, GET 및 DELETE는 주로 URL에 쿼리 문자열을 사용하여 데이터를 전달하기 때문에 Body 작성을 하지 않지만, POSTPUT은 데이터를 HTTP 요청의 body에 포함하여 전달하기 때문에, 필요에 의하면 Body문JSON형식으로 작성하여야함!

3) 작성 방법은 raw (행) 과 JSON 형식으로 필요한 데이터 형식에 맞게 작성하면되고 주의할 점{ } 중가로 안에 작성하여야 하고, 꼭 컬럼명이나 문자열 데이터" " 큰 따옴표 안에 작성하여야 한다!

4) 작성이 완료되면 VSCode에 터미널 cmd 창에서 flask run으로 서버 실행 후 Send를 눌러서 정상 동작 확인!

 

# post : body의 json을 받아서 처리하는 방법

 
class UserRegisterResource(Resource) :
    # 회원가입 API
    def post(self) :
        # 1. 클라이언트가 보낸 데이터를 받아준다.
        # 포스트맨으로 작성한 body 데이터를 json으로 받아온다.
        data = request.get_json()
        print(data)
 

ㄴ 전체 코드문에서 해당 부분이 포스트맨으로 작성한 post : body의 json을 데이터로 받아오는것!
ㄴ print로 해당 부분만 확인이 가능하다!

 

1) VScode 터미널 cmd 창에서 flask run 으로 서버 실행

2) postman 에서 send

3) VScode cmd 영역에서 데이터 출력 확인!

 

전체 실행 동작은 다음 게시글로 계속~!

 

반응형