[TIL Day17] Web Application with Flask

이다혜·2021년 5월 10일
0

TIL

목록 보기
18/60

1. Flask 시작하기

  • Flask?
    - Python 기반 마이크로(essential!) 웹 프레임워크

  • 가상환경 설치하기
    - pip install virtualenv 파이썬 가상환경 모듈 설치
    - virtualenv <가상환경 이름> 현재 디렉토리에 새 virtualenv 가상환경 만들기

  • 가상환경 진입하기
    - ./venv/Scripts/activate.bat

  • 가상환경에 flask 설치하기
    - pip install flask
    - pip freeze 현재 설치된 모듈 확인하기

  • app.py

from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'Hello World!'


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

2. 인터넷과 웹

  • 인터넷(Internet)
    - 전 세계 컴퓨터를 하나로 합치는 거대한 통신망

  • 웹(Web)
    - 인터넷에 연결된 사용자들이 정보를 공유할 수 있는 공간
    - 웹은 클라이언트(정보를 요청하는 고객)와 서버(정보 제공자) 사이의 소통이다!
    - 웹에 있는 개개의 정보를 웹페이지, 웹페이지의 집합을 웹사이트라고 한다.

  • 우리가 Web을 사용하는 방법
    1. 웹브라우저를 켠다.
    2. 주소창에 주소를 입력한다.
    3. Enter를 누르면 원하는 정보가 나온다!
    3-1. 혹은 간혹 에러페이지를 보기도 한다.

Web의 동작방식

  1. Client가 Server에 정보를 요청(Request)한다.

  2. Server는 이 요청받은 정보에 대한 처리를 진행한다.

  3. Server가 Client에게 요청에 대해 응답(Response)한다.

3. Flask with REST API

  • API? Application Programming Interface!
    - 프로그램들이 서로 상호작용하는 것을 도와주는 매개체

  • REST? Representational State Transfer!
    - 웹 서버가 요청을 응답하는 방법론 중 하나
    - 데이터가 아닌, 자원(Resource)의 관점으로 접근

REST API

HTTP URI를 통해 자원을 명시하고 HTTP Method를 통해 해당 자원에 대한 CRUD를 진행

  • URI: 통합 자원 식별자(Uniform Resource Identifier)
    - 인터넷에 있는 자원을 나타내는 유일한 주소
    - URI의 하위개념으로 URL, URN이 있다.

  • HTTP Method
    - GET: 주로 데이터를 읽거나(read) 검색(retrieve)할 때 사용
    - POST: 주로 새로운 리소스를 생성(create)

  • REST API

    - Stateless(무상태성): Client의 Context를 서버에서 유지하지 않는다.

  • Coffee Shop Menu API 구축

from flask import Flask, jsonify, request

app = Flask(__name__)

menus = [{"id": 1, "name": "Espresso", "price": 3800},
         {"id": 2, "name": "Americano", "price": 4100},
         {"id": 3, "name": "CafeLatte", "price": 4600}
         ]


@app.route('/')
def hello_world():
    return 'Hello World!'


# GET /menus | 자료를 가지고 온다.
@app.route('/menus')
def get_menus():
    return jsonify({"menus":menus})


# POST /menus | 자료를 자원에 추가한다.
@app.route('/menus', methods=['POST'])
def create_menu(): # request가 json이라고 가정
    # 전달받은 자료를 menus 자원에 추가
    request_data = request.get_json() # {"name" : ..., "price" : ...}
    new_menu = {
        "id" : 4,
        "name" : request_data['name'],
        "price" : request_data['price']
    }
    menus.append(new_menu)
    return jsonify(new_menu)


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

4. Validation with Postman

Download POSTMAN

  • GET
    - 정상적인 요청(Status: 200 OK)
    - 정의되지 않은 요청(에러 발생) (Status: 404 NOT FOUND)

  • POST
    - json 형태로 요청 보내기

    - 다시 GET method를 실행시켜 메뉴가 정상적으로 추가된 것을 확인

5. 데이터베이스 연동하기

pymysql을 사용해서 Flask와 MySQL DB를 연동해보자.

from flask import Flask, jsonify, request
import pymysql

# DB 연동하기
db = pymysql.connect(host="localhost", port=3306, user="root", password="password", db="menus")
curs = db.cursor(pymysql.cursors.DictCursor)

app = Flask(__name__)

# # 아래 데이터는 DB에 저장되어있다.
# menus = [{"id": 1, "name": "Espresso", "price": 3800},
#          {"id": 2, "name": "Americano", "price": 4100},
#          {"id": 3, "name": "CafeLatte", "price": 4600}
#          ]


@app.route('/')
def hello_world():
    return 'Hello World!'


# GET /menus | 자료를 가지고 온다.
@app.route('/menus')
def get_menus():
    curs.execute('SELECT * FROM menu')
    return jsonify(curs.fetchall())


# POST /menus | 자료를 자원에 추가한다.
@app.route('/menus', methods=['POST'])
def create_menu():
    request_data = request.get_json()
    sql = '''INSERT INTO menu (`name`, `price`)
        VALUES (%s, %s)'''
    curs.execute(sql, (request_data["name"], request_data["price"]))
    db.commit()
    curs.execute('SELECT * FROM menu')
    return jsonify(curs.fetchall())


# PUT | id에 해당하는 데이터를 갱신한다.
@app.route('/menus/<int:menu_id>', methods=['PUT'])
def update_menu(menu_id):
    request_data = request.get_json()
    sql = '''UPDATE menu SET name=%s, price=%s
            WHERE id=%s'''
    curs.execute(sql, (request_data["name"], request_data["price"], menu_id))
    db.commit()
    curs.execute('SELECT * FROM menu')
    return jsonify(curs.fetchall())


# DELETE | id에 해당하는 데이터를 삭제한다.
@app.route('/menus/<int:menu_id>', methods=['DELETE'])
def delete_menu(menu_id):
    sql = '''DELETE FROM menu where id=%s'''
    curs.execute(sql, menu_id)
    db.commit()
    curs.execute('SELECT * FROM menu')
    return jsonify(curs.fetchall())


if __name__ == '__main__':
    app.run()
profile
하루하루 성장중

0개의 댓글