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()
인터넷(Internet)
- 전 세계 컴퓨터를 하나로 합치는 거대한 통신망
웹(Web)
- 인터넷에 연결된 사용자들이 정보를 공유할 수 있는 공간
- 웹은 클라이언트(정보를 요청하는 고객)와 서버(정보 제공자) 사이의 소통이다!
- 웹에 있는 개개의 정보를 웹페이지, 웹페이지의 집합을 웹사이트라고 한다.
우리가 Web을 사용하는 방법
1. 웹브라우저를 켠다.
2. 주소창에 주소를 입력한다.
3. Enter를 누르면 원하는 정보가 나온다!
3-1. 혹은 간혹 에러페이지를 보기도 한다.
Client가 Server에 정보를 요청(Request)한다.
Server는 이 요청받은 정보에 대한 처리를 진행한다.
Server가 Client에게 요청에 대해 응답(Response)한다.
API? Application Programming Interface!
- 프로그램들이 서로 상호작용하는 것을 도와주는 매개체
REST? Representational State Transfer!
- 웹 서버가 요청을 응답하는 방법론 중 하나
- 데이터가 아닌, 자원(Resource)의 관점으로 접근
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()
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()