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의 동작 방식

  • 일반적인 웹을 사용하는 방식
    1. 웹 브라우저 실행
    2. 주소창에 주소를 입력하고 Enter

즉,

  1. Client가 Server에 정보를 요청
  2. Server는 요청받은 정보에 대한 처리를 진행
  3. 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는 리스트형으로써 여러 메소드를 지정할 수 있다.
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/