RESTful flask API - DB연동, CRUD, 데이터 전달(Path/QueryString/Json)

반응형

이 글은 작성된 포스팅의 기능을 정리한 글 입니다.

예시를 통해 좀 더 자세한 설명이 필요하신 분은 아래의 목록을 참고해주세요.

2022.06.17 - [Programming/Rest API (Python)] - POSTMAN 사용법 - 간단 예시를 API 서버 테스트하기 + Beautify

2022.06.17 - [Programming/Rest API (Python)] - API서버 - RestFul API의 기본 개념, 구성

2022.06.17 - [Programming/Rest API (Python)] - API Flask - route 이해하기

2022.06.17 - [Programming/Rest API (Python)] - API서버 - DB 연동하기

2022.06.19 - [Programming/Rest API (Python)] - API서버 - 파이썬으로 DB에 값 넣기 (POST)

2022.06.19 - [Programming/Rest API (Python)] - API서버 - 클라이언트로부터 입력받은 값 DB에 넣기 (POST)

2022.06.19 - [Programming/Rest API (Python)] - API서버 - 클라이언트로부터 특정 정보의 값 출력하기 (GET)

2022.06.19 - [Programming/Rest API (Python)] - API서버 - 클라이언트에서 입력받은 값으로 DB 수정하기 (PUT)

2022.06.19 - [Programming/Rest API (Python)] - API서버 - 클라이언트가 원하는 값 삭제하기 (DELETE)

2022.06.20 - [Programming/Rest API (Python)] - API서버 - DB의 값의 공개/비공개 여부 설정하기

2022.06.20 - [Programming/Rest API (Python)] - POSTMAN - 설계한 API 기능을 문서화하기 (기능 명세서 만들기)


Methods

  • GET : 데이터 호출
  • POST : 데이터 생성
  • PUT : 데이터 업데이트, 모든 속성을 확인하여 값을 수정
  • PATCH : 데이터 업데이트, 일부 속성에 대한 값을 수정
  • DELETE : 데이터 삭제

데이터 전달 (QueryString / Path / Json)

예시) 두 수의 합이 입력한 값을 갖는 API (10 입력시 1+9, 2+8 등등) 

  • 전달하는 값의 이름은 hap으로 통일
    • path : 메인 파일의 add_resource 경로에서 지정
    • query string : 리소스 클래스 내에 request.args.get() 으로 호출
    • json : json 형식으로 파싱하여 전송

예시 코드

  • app.py (메인)
from flask import Flask
from flask_restful import Api

from test import testPathResource, testQueryStrinJsonResource

app = Flask(__name__)
api = Api(app)

api.add_resource(testPathResource, '/test/<int:hap>')
api.add_resource(testQueryStrinJsonResource, '/test')

if __name__ == '__main__' :
    app.run()

 

  • test.py
from flask import request
from flask_restful import Resource
import random

class testPathResource(Resource) :
    def get(self, hap) : # Path
        op1 = random.randint(1, hap-1)
        op2 = hap - op1

        result = str(op1) + "+" + str(op2)
        return {
            'result' : result
        }

class testQueryStrinJsonResource(Resource) :
    def get(self) : # Query String
        hap = request.args.get('hap')
        op1 = random.randint(1, int(hap)-1)
        op2 = int(hap) - op1

        result = str(op1) + "+" + str(op2)
        return {
            'result' : result
        }

    def put(self) : # Json
        data = request.get_json()
        op1 = random.randint(1, data['hap']-1)
        op2 = data['hap'] - op1

        result = str(op1) + "+" + str(op2)
        return {
            'result' : result
        }

사용 예시

Path


Query String


Json


DB 연동

  • app.py (메인)
from flask import Flask
from flask_restful import Api

from test import testMysqlConnect

app = Flask(__name__)
api = Api(app)

api.add_resource(testMysqlConnect, '/mysqltest')

if __name__ == '__main__' :
    app.run()

DB 설정 (MySQL)

  • mysql_connection.py
import mysql.connector
def getConnection() :
    connection = mysql.connector.connect(
        host='localhost'
        database='test'
        user='root',
        password='1234' )
    return connection

CRUD / Method

  • mysql_test.py
from flask import request
from flask_restful import Resource

import mysql.connector
from mysql_connection import getConnection

class MysqlResource(Resource) :
	# 메소드 작성

select (get)

예시) 페이징 기법을 활용하여 데이터 조회 

def get(self):
    # 쿼리 스트링으로 오는 데이터 저장, 페이징 처리
    offset = request.args.get('offset')
    limit = request.args.get('limit')

    try :
    	# DB 접속
        connection = getConnection()

		# 쿼리 작성
        query = '''
                    select *
                    from testtable
                    limit
                ''' + offset + ''',''' + limit + ''';'''

        # 셀렉트문은 딕셔너리(키:밸류) 형태로 값 호출
        cursor = connection.cursor(dictionary=True)
        
        # 쿼리 실행
        cursor.execute(query)

		# 조회 데이터 저장 (fetchall : 데이터를 배열 형태로 값 호출)
        result_list = cursor.fetchall()

    	# DB에서 시간 데이터를 불러올 경우, 데이터 타입 변경
        # i = 0
        # for record in result_list :
        #     result_list[i]['created_at'] = record['created_at'].isoformat()
        #     result_list[i]['updated_at'] = record['updated_at'].isoformat()
        #     i += 1

        cursor.close()
        connection.close()

    except mysql.connector.Error as e :
        print(e)
        cursor.close()
        connection.close()
        return {"error" : str(e)}, 503 #HTTPStatus.SERVICE_UNAVAILABLE

    return{ # 조회 결과는 json 형식으로 작성
        "result" : "success",
        "count" : len(result_list),
        "result_list" : result_list
    }, 200

insert (post)

예시) 이름과 이메일을 DB에 저장

def post(self) :
    # 클라이언트에서 body 부분에 작성한 json을 받아오는 코드
    data = request.get_json()
    
    try :
        # DB 접속
        connection = getConnection()

		# 쿼리 작성, 입력할 데이터 %s로 입력
        query = '''
                insert into testtable (name, email)
                values (%s, %s);
                '''

        # json으로 전달 받은 데이터 저장
        record = (data['name'], data['email'])
        
        # 커서 생성 및 쿼리 실행
        cursor = connection.cursor()
        cursor.execute(query, record)

        # 입력한 데이터 DB에 커밋
        connection.commit()

        cursor.close()
        connection.close()

    except mysql.connector.Error as e :
        print(e)
        cursor.close()
        connection.close()
        return {"error" : str(e)}, 503 #HTTPStatus.SERVICE_UNAVAILABLE

    return { "result" : "success" } # 조회 결과는 json 형식으로 작성

update (put)

예시) 특정 id의 이메일 정보 수정

def put(self) :
	# 클라이언트에서 body 부분에 작성한 json을 받아오는 코드
    data = request.get_json()
    try :
    	# DB 접속
        connection = getConnection()
        
        # 쿼리 작성, 입력할 데이터 %s로 입력
        query = '''
                update testtable
                set email = %s
                where id = %s;
                '''
        # json으로 전달 받은 데이터 저장
        record = (data['email'], data['id'])
        
        # 커서 생성 및 쿼리 실행
        cursor = connection.cursor()
        cursor.execute(query, record)
        
        # 입력한 데이터 DB에 커밋
        connection.commit()
        
        cursor.close()
        connection.close()

    except mysql.connector.Error as e :
        print(e)
        cursor.close()
        connection.close()
        return {"error" : str(e)}, 503 #HTTPStatus.SERVICE_UNAVAILABLE

    return {"result" : "success"}, 200 # 조회 결과는 json 형식으로 작성

delete (delete)

def delete(self) :
	# 클라이언트에서 body 부분에 작성한 json을 받아오는 코드
    data = request.get_json()
    
    try :
    	# DB 접속
        connection = getConnection()
        
        # 쿼리 작성, 입력할 데이터 %s로 입력
        query = '''
                delete from testtable
                where id = %s;
                '''
        
        # json으로 전달 받은 데이터 저장
        record = (data['id'], )
        
        # 커서 생성 및 쿼리 실행
        cursor = connection.cursor()
        cursor.execute(query, record)
        
        # 입력한 데이터 DB에 커밋
        connection.commit()
        
        cursor.close()
        connection.close()

    except mysql.connector.Error as e :
        print(e)
        cursor.close()
        connection.close()
        return {"error" : str(e)}, 503 #HTTPStatus.SERVICE_UNAVAILABLE

    return {"result" : "success"}, 200 # 조회 결과는 json 형식으로 작성
반응형