RESTful flask API - 클라이언트로부터 입력받은 값 DB에 넣기 (POST)

반응형

이번 포스팅은 DB와 연결하여 클라이언트가 값을 넣는 방법을 설명합니다.

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
  • 서버 URL : 로컬호스트/recipes
# app.py
from flask import Flask
from flask_restful import Api
from resources.recipe import RecipeListResource

app = Flask(__name__)

api = Api(app)

# 경로와 리소스(api코드) 연결
api.add_resource(RecipeListResource, '/recipes')

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

 

기능 설계

  • 추가 리소스 파일 : recipe.py
    • 클라이언트에서 입력한 값을 DB에 저장하는 코드
    • request.get_json() : 클라이언트에서 입력한 값(키:밸류) 호출
    • json으로 호출한 데이터를 이용하여 DB에 데이터 생성 (data=request.get_json -> data 변수 이용)
from flask import request
import mysql.connector
from flask_restful import Resource

# DB 연결, 개인의 환경에 맞게 설정
connection = mysql.connector.connect(
    host='host',
    database='DB',
    user='user_name',
    password='user_pwd' )

# API를 만들기 위한 클래스 작성
# 클래스 : 변수와 함수로 구성된 묶음
# 클래스는 상속이 가능
# API를 만들기 위한 클래스는 flask_restful 라이브러리의 Resource class를 상속해서 생성하여야 함
class RecipeListResource(Resource) :
    # restful api의 methods에 해당하는 함수 작성
    def post(self) :
        # api 실행 코드를 여기에 작성
        # 클라이언트에서 body 부분에 작성한 json을 받아오는 코드
        data = request.get_json()
        try :
            # DATA INSERT
            # 1. Connect DB
            connection = get_connection()
            # 2. SQL Query
            query = '''
                    insert into recipe
                        (name, description, cook_time, direction)
                    values
                        (%s, %s, %s, %s);
                    '''
            record = (data['name'], data['description'], data['cook_time'], data['direction'] )
            # 3. Get Cursor
            cursor = connection.cursor()
            # 4. Execute Query with cursor
            cursor.execute(query, record)
            # 5. DATA commit
            connection.commit()
            # 6. Close Resource
            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

POSTMAN

API 기능 테스트

  • POST - 로컬호스트/recipes
  • Body - raw - JSON
  • 코드 입력 후 Send


MySQL

  • 생성 확인 : select * from recipe


중복 입력 못하게 하기

MySQL - 테이블 설정

  • name 컬럼에 UQ (고유 값) 부여

 

POSTMAN

  • 중복 값 입력되는지 테스트

반응형