Flask
Python 기반 마이크로(essential)
웹 프레임워크
Flask
가상환경 구축하기
# 파이썬 가상환경 모듈 설치
$ pip install virtualenv
# 현재 디렉토리에 새 virtualenv 가상환경 설치
$ virtualenv <가상환경 이름>
Flask 설치하기
pip install flask
간단한 flask app
from flask import Flask
# 이 flask의 이름을 app의 변수에 넣어준다.
app = Flask(__name__)
# @ = 데코레이터
# 가로안에 있는 주소를 인자로 받았을 때
# 밑에 있는 함수를 실행하라는 뜻
@app.route('/') # '/' 주소 요청에 대한 처리
def hello_flask():
return 'Hello World!'
# __name__ 가 __main__일 때 실행해라
# 즉, app.py 파일을 직접적으로 실행할 때 이 로직을 사용해라
if __name__ == '__main__':
app.run()
인터넷과 웹
- 인터넷(Internet) : 전 세계 컴퓨터들이 연결된 하나의 거대한 통신망
- 인터넷에는 웹, 메일 등이 존재함
- 웹(Web) : 인터넷에 연결된 사용자들이 정보를 공유할 수 있는 공간
- 웹페이지 : 웹에 있는 정보
- 웹사이트 : 웹페이지의 집합
Web의 동작 방식
- 일반적인 웹을 사용하는 방식
- 웹 브라우저 실행
- 주소창에 주소를 입력하고
Enter
즉,
- Client가 Server에 정보를 요청
- Server는 요청받은 정보에 대한 처리를 진행
- Server가 Client에게 처리 결과를 응답
\(\Rightarrow\) Client와 Server는 HTTP 프로토콜 방식으로 통신한다.
API
- API : 프로그램들이 서로 상호작용하는 것을 도와주는 매개체
REST API (Repressentational State Transfer)
웹 서버가 요청을 응답하는 방법론 중 하나,
데이터가 아닌 자원(Resource)의 관점으로 접근
- HTTP URI를 통해 자원을 명시하고
- HTTP Method를 통해 해당 자원에 대한 CRUD를 진행
URI ( Uniform Resource Identifier, 통합 자원 식별자 ) : 인터넷에 있는 자원을 나타내는 유일한 주소
HTTP Method : 자원에 대한 행위를 나타내는 수단 ( GET, POST, PUT, PATCH, DELETE 등이 있음 )
# 예시 1.
- 자원(Resource)은 모두
/order
으로 이어도 HTTP Method에 따라서 행위가 달라짐 - REST API의 Stateless(상태 비보존형)
- Client의 Context를 서버에서 유지하지 않는다.
# 예시 2.
POST /shoes
는 자원에 새로운 정보를 생성GET /shoes
는 DB에서 shoes가 있는지 확인 후 해당 자원 반환
\(\Rightarrow\) (서버 입장에서) 아이템을 GET 하기 위해서 POST를 진행할 필요가 없다
REST API 구축해보기
Coffee Shop Menu API 구축
같은 자원(Menu)에 대해서 다른 로직을 구현
- GET
- POST
- @app.route('/menus', method=['POST'])
- methods의 기본값은 'GET'
- methods는 리스트형으로써 여러 메소드를 지정할 수 있다.
- @app.route('/menus', method=['POST'])
from flask import Flask, jsonify, request
# jsonify -> json 형태로 바꾸는 모듈
# request -> HTTP request를 다룰수 있는 모듈
app = Flask(__name__)
menus = [
{'id':1, 'name':'Expresso', 'price':3800},
{'id':2, 'name':'Americano', 'price':4100},
{'id':3, 'name':'CafeLatte', 'price':4600}
]
@app.route('/')
def hello_flask():
return 'Hello World!'
# GET /menus | 자료를 가지고 온다.
# method에 default는 GET이므로 생략가능
@app.route('/menus')
def get_menus():
# List 타입은 json화 시킬수 없다.
# 따라서 dict를 새로 만든다.
return jsonify({'menus':menus})
# POST /menus | 자료를 자원에 추가한다.
# POST, PUT, DELETE 등 method인자로 넣겨줘야한다.
@app.route('/menus', methods=['POST'])
def create_menu(): # request가 JSON이라고 가정
# 전달받은 자료를 menus 자원에 추가
request_data = request.get_json() # {'name' : ..., 'price':...}
new_menu = {
'id' : len(menus)+1,
'name' : request_data['name'],
'price' : request_data['price']
}
menus.append(new_menu)
return jsonify(new_menu)
# __name__ 가 __main__일 때 실행해라
# 즉, app.py 파일을 직접적으로 실행할 때 이 로직을 사용해라
if __name__ == '__main__':
app.run()
API 테스트
Postman을 통해 API 테스트 진행
0. 404 오류
1. GET menus/
2. POST menus/
3. GET menus/
'프로그래머스인공지능스쿨' 카테고리의 다른 글
[4주차 - Day3] 데이터 씹고 뜯고 맛보고 즐기기 - EDA (0) | 2021.05.14 |
---|---|
[4주차 - Day2] 클라우드를 활용한 머신러닝 모델 Serving API 개발 (0) | 2021.05.11 |
[3주차 - Day4] Python으로 시각화하기 - Matplotlib (0) | 2021.05.06 |
[3주차 - Day3] Python으로 데이터 다루기 II - Pandas (0) | 2021.05.05 |
[3주차 - Day2] Python으로 데이터 다루기 I - numpy (0) | 2021.05.04 |