Posts [프로그래머스 인공지능스쿨] Week4-1 Flask
Post
Cancel

[프로그래머스 인공지능스쿨] Week4-1 Flask

강의


Flask

파이썬 기반의 웹 프레임워크

  • 파이썬 가상환경 설정하기

cmd 에서 virtualenv env_name 를 입력해주면 현재 폴더에 env_name이란 가상환경을 설치할 수 있다.

실행은 .\env_name\scripts\activate 명령으로 실행할 수 있다.
해제는 deactivate 로 가상환경을 해제한다.

  • 가상환경에서 패키지 설치하기

가상환경을 실행한 후 pip을 통해 install한다.
현재 가상환경내에 설치되어 있는 패키지 목록은 pip freeze 명령어를 통해 확인할 수 있다.

  • 웹 페이지 생성하기

app.py 파일을 만들어준다.

1
2
3
4
5
6
7
8
9
10
from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/')
def hello_flask():
    return "Hello World"

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

파일을 저장한 후 cmd에서 flask run 명령어를 통해 해당 웹페이지를 실행할 수 있다.

REST API

REST(Representational State Transfer) 이란, 웹 서버가 요청을 응답하는 방법론 중 하나이다.

데이터가 아닌, 자원의 관점으로 접근한다.

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

Assignment

CRUD 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#GET (Read)
@app.route('/menus')
def get_menus():
    return jsonify({'menus' : menus})

#POST (Create)
@app.route('/menus', methods=['POST'])
def create_menus():
    request_data = request.get_json()
    size = len(menus)
    menus_key = list(menus.keys())
    id = menus_key[size - 1] + 1
    menus[id] = {
        "name" : request_data['name'],
        "price" : request_data['price']
    }
    return jsonify(menus[id])

#PUT (Update)
@app.route('/menus/<int:id>', methods=['PUT'])
def update_menus(id):
    request_data = request.get_json()
    try:
        menus[id] = {'name' : request_data['name'], 'price' : request_data['price']}
    except:
        return "ID is wrong"
    return jsonify(menus[id])

#DELETE (Delete)
@app.route('/menus/<int:id>', methods=['DELETE'])
def delete_menus(id):
    try:
        del menus[id]
    except:
        return "ID is wrong"
    return jsonify({'menus' : menus})

DB 연동

mysql을 파이썬에서 사용하기 위해서는 pymysql 모듈이 필요하다.
pip install PyMySQL 을 설치해주고

import pymysql 을 해주면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
from flask import Flask, jsonify, request
import pymysql

db = pymysql.connect(host="localhost", port = 3306, user="root", passwd = "gksrnr12", db = 'coffee_menus', charset="utf8")

cur = db.cursor()

app = Flask(__name__)


# sql = """INSERT INTO menus VALUES(1, 'Espresso', 3000), (2, 'Americano', 4000), (3, 'CafeLatte', 5000)"""
# cur.execute(sql)
# db.commit()
sql = """SELECT * FROM menus"""
cur.execute(sql)
m = cur.fetchall()
menus = {}
for item in m:
    menus[item[0]] = {
        "name" : item[1],
        "price" : item[2]
    }


@app.route('/')
def hello_flask():
    return "Hello World"

#get /menus
@app.route('/menus')
def get_menus():
    return jsonify({'menus' : menus})

#post /menus
@app.route('/menus', methods=['POST'])
def create_menus():
    request_data = request.get_json()
    size = len(menus)
    menus_key = list(menus.keys())
    id = menus_key[size - 1] + 1
    name = request_data['name']
    price = request_data['price']
    menus[id] = {
        "name" : name,
        "price" : price
    }
    sql = """INSERT INTO menus VALUES('%d', '%s', '%d')""" % (id, name, price)
    cur.execute(sql)
    db.commit()

    return jsonify(menus[id])

#put
@app.route('/menus/<int:id>', methods=['PUT'])
def update_menus(id):
    request_data = request.get_json()
    try:
        name = request_data['name']
        price = request_data['price']
        menus[id] = {'name' : name, 'price' : price}
        sql = """UPDATE menus SET name = '%s', price = '%d' WHERE id = '%d'""" % (name, price, id)
        cur.execute(sql)
        db.commit()
    except:
        return "ID is wrong"
    return jsonify(menus[id])


@app.route('/menus/<int:id>', methods=['DELETE'])
def delete_menus(id):
    try:
        del menus[id]
        sql = """DELETE FROM menus WHERE id = '%d'""" % (id)
        cur.execute(sql)
        db.commit()
    except:
        return "ID is wrong"
    return jsonify({'menus' : menus})

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

나중에 수정할 일이 생기면, db쪽을 따로 분리해서 클래스화 해줘야겠다.


This post is licensed under CC BY 4.0 by the author.