강의
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쪽을 따로 분리해서 클래스화 해줘야겠다.