반응형
이번 포스팅은 DB의 'is_publish' 라는 컬럼의 값을 이용하여 해당 컬럼의 값이 1인 값만 목록을 출력하는 기능을 설명합니다. 즉, 공개 설정 된 데이터만 목록을 출력하는 API 기능을 서술합니다.
DB 연동 과정은 이전 포스팅을 참고해주세요.
https://luvris2.tistory.com/182
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개의 항목만 출력
반응형