API서버 - DB의 값의 공개/비공개 여부 설정하기

이번 포스팅은 DB의 'is_publish' 라는 컬럼의 값을 이용하여 해당 컬럼의 값이 1인 값만 목록을 출력하는 기능을 설명합니다. 즉, 공개 설정 된 데이터만 목록을 출력하는 API 기능을 서술합니다.

DB 연동 과정은 이전 포스팅을 참고해주세요.

https://luvris2.tistory.com/182

 

API서버 - DB 연동하기

API서버 DB연동하기 DB : MySQL Programming language : Python IDE : Visual Studio Code MySQL DB 생성 (recipe) Table 생성 (recipe, user) DB를 관리 할 수 있는 권한 설정하기 (MySQL) SQL 쿼리 use mysql;..

luvris2.tistory.com


Visual Studio Code

API 서버 구축

  • 메인 파일 : app.py
  • DB의 목록에서 공개 비공개(임시저장과 같은 의미) 여부를 설정
    • 서버 URL : 로컬호스트/recipes/<int:recipe_id>/publish
  • DB의 목록을 출력, 공개 설정 된 값만 출력
    • 서버 URL : 로컬호스트/recipes
# app.py
from flask import Flask
from flask_restful import Api
from resources.recipe_publish import RecipePublishResource
from resources.recipe import RecipeListResource

app = Flask(__name__)

api = Api(app)

# 경로와 리소스(api코드) 연결
api.add_resource(RecipePublishResource, '/recipes/<int:recipe_id>/publish')
api.add_resource(RecipeListResource, '/recipes')

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

 

기능 설계 - 공개 설정

  • 추가 리소스 파일 : recipe_publish.py
    • 클래스 RecipePublishResource를 자원화
    • 클라이언트에서 입력한 값의 공개/비공개 여부를 설정
    • PUT을 사용하여 값을 0에서 1로 변경
    • DB의 is_publish 컬럼을 이용하여 0일 경우 비공개, 1일 경우 공개로 소스 코딩
    • recipe_id 를 전달받아 특정 값 호출
from flask import request
from flask_restful import Resource
import mysql.connector
from mysql_connection import get_connection

class RecipePublishResource(Resource) :
    # 레시피를 공개
    def put(self, recipe_id) :
        data = request.get_json()
        connection = get_connection()
        # recipe_id를 가지고 DB의 is_publish 컬럼을 1로 변경
        try :
            query = '''
                    update recipe set
                        is_publish = 1
                    where id = %s;
                    '''
            record = (recipe_id, )
            cursor = connection.cursor()
            cursor.execute(query, record)
            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

        # 정상적으로 됐을 때 200, 기본 값이므로 생략 가능
        return {"result" : "success"}, 200

POSTMAN

API 기능 테스트

  • PUT - 로컬호스트/recipes/숫자/publish
  • Send


MySQL

  • is_publish 0 -> 1
  • id = 2의 is_publish 컬럼 기존 값 : 0 (select * from recipe)

 

  • id = 2의 is_publish 컬럼 변경 확인 : 1 (select * from recipe)


Visual Studio Code

기능 설계 - 비공개(=임시저장) 설정

  • 추가 리소스 파일 : recipe_publish.py
    • 클래스 RecipePublishResource를 자원화
    • 클라이언트에서 입력한 값의 공개/비공개 여부를 설정
    • DELETE를 사용하여 값을 1에서 0으로 변경, 형식상 DELETE 메소드이지만 Update Query문 사용
    • 이 기능에서는 비공개 여부와 임시 저장 여부는 동일한 의미로 사용
    • DB의 is_publish 컬럼을 이용하여 0일 경우 비공개, 1일 경우 공개로 소스 코딩
    • recipe_id 를 전달받아 특정 값 호출
    • 위의 소스 코드와 같은 파일에 위치하므로 밑에 붙여넣으면 됩니다.
    # 레시피를 임시저장
    def delete(self, recipe_id) :
        # DB의 is_publish 컬럼을 0으로 변경
        data = request.get_json()
        connection = get_connection()
        # recipe_id를 가지고 DB의 is_publish 컬럼을 1로 변경
        try :
            query = '''
                    update recipe set
                        is_publish = 0
                    where id = %s;
                    '''
            record = (recipe_id, )
            cursor = connection.cursor()
            cursor.execute(query, record)
            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

        # 정상적으로 됐을 때 200, 기본 값이므로 생략 가능
        return {"result" : "success"}, 200

POSTMAN

API 기능 테스트

  • PUT - 로컬호스트/recipes/숫자/publish
  • Send


MySQL

  • is_publish 1 -> 0
  • id = 2의 is_publish 컬럼 기존 값 : 1 (select * from recipe)

 

  • id = 2의 is_publish 컬럼 변경 확인 : 0 (select * from recipe)


Visual Studio Code

기능 설계 - 공개 설정 된 값만 목록 출력

  • 추가 리소스 파일 : recipe.py
    • 클래스 RecipeListResource를 자원화
    • 클라이언트가 목록을 요청하면 공개 설정(is_publish=1)된 값만 출력
    • GET을 사용하여 목록 출력
from flask import request
from flask_restful import Resource
import mysql.connector
from mysql_connection import get_connection

class RecipeListResource(Resource) :
	def get(self):
        offset = request.args.get('offset')
        limit = request.args.get('limit')

        try :
            connection = get_connection()

            query = '''
                        select *
                        from recipe
                        where is_publish = 1
                        limit {}, {};'''.format(offset, limit)
                        
            cursor = connection.cursor(dictionary=True)
            cursor.execute(query)
            result_list = cursor.fetchall()

            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{
            "result" : "success",
            "count" : len(result_list),
            "result_list" : result_list
        }, 200

MySQL

  • is_publish = 1 인 값 확인 (select * from recipe)


POSTMAN

API 기능 테스트

  • GET - 로컬호스트/recipes/
  • Send
  • 출력하는 목록은 3개이지만, is_publish=1인 항목이 1개이므로 1개의 항목만 출력