본문 바로가기
Flask

Flask 1단계 Postman, Mysql, Github 기본세팅

by leopard4 2023. 1. 4.

백엔드 서버를 프레임워크 (Flask)로 구현하는 기본

1. 화면 기획문서를 보고 

-- 서비스가 이용할 MySQL 데이터베이스를 만든다.
use mysql;

-- 서버마다 유저를 만든다

-- 이계정은 이 DB만 접속가능 

-- @'%' == 네트워크로 작업가능하게 한다는것

-- dentified by == 패스워드


create user '아이디'@'%' identified by '비번';

-- 권한설정
grant all on recipe_DB.* to '아이디'@'%';

 

 

 

mysql 스키마를 생성한다.

테이블을 만든다.

 

+버튼을 눌러 해당 정보를 기입하여 커넥션

 

 

데이터 베이스 작업이 완료되었다면 

github 레파지토리는 프라이빗(보안)으로 만들고 클론하고 실행.

 

vscode로 메인앱 코드작성

메인 화면은 유지보수를 위해 최소한으로 작성하고

함수파일을 폴더에 분리하여 관리한다.

(메인화면에선 호출만 한다는뜻.)

함수파일의 폴더이름은 일반적으로

resources 를 사용함.

# 메인화면

from flask import Flask
from flask_restful import Api
from config import Config

from resources.recipe import RecipeListResource

app = Flask(__name__)
# 환경변수 셋팅
app.config.from_object(Config)

api = Api(app)

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

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

 

 

# 리소스 코드

from flask import request
from flask_restful import Resource

# API 를 만들기 위한 클래스 작성.
# class란 ?? 변수와 함수로 구성된 묶음
# 클래스는 상속이 가능하다!
# 상속이란 ?? 기존 클래스를 확장하여 새로운 클래스를 만드는 것
# API를 만들기 위해서는, flask_restful 라이브러리의 
# Resource 클래스를 상속해서 만들어야 한다.

class RecipeListResource(Resource):
    
    # APi를 처리하는 함수 개발
    # HTTP Method 를 보고 ! 똑같이 만들어준다.

    def post(self):
        # 1. 클라이언트가 보내준 데이터가 있으면
        #    그 데이터를 받아준다.
        data = request.get_json()
        # print(data)
        
        # 2. 받은 데이터(레시피정보)를 DB에 저장한다.
    


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

 

이과정에서 클라이언트는 아직 개발되지 않았으므로 

postman 앱을 사용하여 api가 정상적으로 동작하는지를 테스트해보면서 작성한다.

postman화면

 

import mysql.connector

from config import Config 

def get_connection():

    connection = mysql.connector.connect(
        host = Config.HOST ,
        database = Config.DATABASE,
        user = Config.DB_USER,
        password = Config.DB_PASSWORD
    )
    return connection

DB계정정보는 중요한 데이터 이므로 config로 분리하여 보관하고 (시큐어코딩)

추후 커밋시에 .gitignore로 해당 데이터를 제외하고 푸쉬한다.

 

# config 파일의 정보

class Config :
    HOST = "호스트주소"
    DATABASE = '데이터베이스이름'
    DB_USER = 'db아이디'
    DB_PASSWORD = 'db패스워드'

 

DB를 연결 하였으면 

mysql로 돌아가 쿼리문을 만들고

SELECT * FROM recipe;

insert into recipe
(name, description, num_of_servings, cook_time, directions)
values
('테스트메뉴', '테스트설명', 4 , 40, '맛있게 만들면 된다' );

 

다시 vscode로 와서 리소스 코드를 계속해서 작성.

        try :
            ### 1 . DB 연결
            # mysql_connection.py 에서 만든 함수를 호출
            connection = get_connection()

            ### 2. 쿼리문 만들기
            query = '''
                    insert into recipe
                    (name, description, num_of_servings, cook_time, directions)
                    values
                    ( %s, %s, %s, %s, %s );'''
            ### 3. 쿼리에 매칭되는 변수 처리 해준다.
            record = (data['name'], data['description'], data['num_of_servings'], data['cook_time'], data['directions'])

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

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

이 코드에서 try 를 사용하는 이유는 

불러온 라이브러리는 내가 만든 라이브러리가 아니기 때문에

어떤 오류가 발생할지 전부 예상할 수 없다.

그런데 오류가 발생해버리면 서비스(서버)가 멈추기 때문에.

오류가 발생해도 서버는 유지되도록 하기위함이다.

그리고 그 오류는 클라이언트로 전달하여 사용자가 알수있게 처리한다.