Rest API

API 서버 - query string 페이징 처리

왕현성 2023. 1. 6. 14:19
728x90
from flask import request
from flask_restful import Resource

from mysql_connection import get_connection
from mysql.connector import Error
from flask_jwt_extended import jwt_required
from flask_jwt_extended import get_jwt_identity

class MemoListResource(Resource) : 
    

    # API를 처리하는 함수 개발
    # HTTP Method를 보고! 똑같이 만들어준다.

    # jwt 토큰이 필수라는 뜻! : 토큰이 없으면 이 API는 실행이 안 된다.
    @jwt_required()
    def post(self) :




        # 1. 클라이언트가 보내준 데이터가 있으면
        #    그 데이터를 받아준다.
        data = request.get_json()

        # 1-1 헤더에JWT 토큰이 있으면 토큰 정보를 받아준다
        user_id = get_jwt_identity()



        # 2. 이 레시피정보를 DB에 저장해야한다.
        
        try :
            ### 1. DB에 연결
            connection = get_connection()

            ### 2. 쿼리문 만들기
            query = '''insert into memo
                    (userId,title,date,content)
                    values
                    (%s,%s,%s,%s);'''
            ### 3. 쿼리에 매칭되는 변수 처리 해준다. 튜플로!
            record = ( user_id,data['title'],data['date'],data['content'] )

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

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

            ### 6. 커밋을 해줘야 DB에 완전히 반영된다.
            connection.commit()

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

        except Error as e :

            print(e)
            cursor.close()
            connection.close()

            return{"result" : "fail", "error" : str(e)} , 500



        # API를 끝낼때는
        # 클라이언트에 보내줄 정보(json)와 http 상태 코드를
        # 리턴한다.
        return {"result" : "success"} , 200

    def get(self) :
        # 1. 클라이언트로부터 데이터를 받아온다.
        # 없다.

        # 클라이언트에서 쿼리스트링으로 보내는 데이터는
        # request.args에 들어있다.

        offset = request.args.get('offset')
        limit=request.args.get('limit')



        # 2. db에 저장된 데이터를 가져온다.
        try :
            connection = get_connection()

            query = '''select *
                        from memo
                        order by date desc
                        limit '''+ offset +''','''+ limit +''';'''

            ## 중요!!!! select 문은 
            ## 커서를 가져올 때 dictionary = True로 해준다
            cursor = connection.cursor(dictionary=True)

            cursor.execute(query)

            result_list=cursor.fetchall()

            print(result_list)
            
            # 중요 ! db에서 가져온 timestamp는
            # 파이썬에서 datetime으로 자동 변환된다.
            # 그런데 문제는 !!! 우리는 json으로
            # 클라이언트한테 데이터를 보내줘야 하는데
            # datetime은 json으로 보낼 수 없다.
            # 따라서 시간을 문자열로 변환해서 보내준다.
            i = 0
            for row in result_list :
                result_list[i]['createdAt']=row['createdAt'].isoformat()
                result_list[i]['updatedAt']=row['updatedAt'].isoformat()
                result_list[i]['date']=row['date'].isoformat()
                i = i+1




            cursor.close()
            connection.close()
        except Error as e :
            print(e)
            cursor.close()
            connection.close()
            return{"result":"fail","error":str(e)}, 500
        
        return {"result" : 'seccess','items':result_list,'count':len(result_list)}, 200

DB에 저장된 메모를 가져오는 서비스를 개발하는 중에, 페이징처리 하는 법 ( SQL : offset , limit )은

우선 MySQL에서 쿼리문을 작성하고

 

위 사진과 같이 문자열 부분을 나눠주고 

 

포스트맨의 키값과 밸류값을 입력해주고 확인하면

 

리미트 값인 7개씩만 가져오는 것을 확인할 수 있다.