Flask로 REST API 구현하기 - 1. Flask-RESTX

oneofakindscene·2021년 8월 16일
1

flask

목록 보기
2/4

Django vs Flask

  • Python에서 Django와 Flask는 가장 널리 사용되는 오픈소스 기반 웹 프레임워크
  • Django는 Python의 full stack web framework인 반면 Flask는 가볍고 확장 가능한 web framework입니다.
    • Django는 기능이 훨씬 뛰어나지만 복잡하고
    • Flask는 매우 단순하고 가볍습니다.
  • Django에서는 탄탄한 framework 안에서 다른 설계 패턴으로 벗어날 수 없다는 점
  • Flask에서는 직접 새로운 framework로 설계할 수 있다는 장점이 있지만 이제 막 파이썬 웹 프레임워크에 진입하는 입장에서는 신경써야할게 한두가지가 아니기때문에 최대 단점으로 다가올 수 있습니다.
  • Django는 게시판같은 복잡한 구조의 웹을 구성하기에는 좋아보이지만, 단순한 REST API 서버를 만들기에는 군더더기 없는 Flask가 더 효율적

Django

  • 구글 앱 엔진에서 django를 사용하게 되면서 많은 사람들이 사용하게 되었으며, web application을 개발하기 위한 대부분의 기능들이 갖추어져 있기 때문에 외부 도구 및 라이브러리를 사용하지 않고도 어느 정도 규모가 있는 web application 개발에도 문제가 없습니다.
  • Django는 ORM (Object relational mapping) 기능이 내장되어있습니다.
    • ORM은 객체 관계 매핑이라고도 하며 <데이터베이스 시스템>과 <데이터 모델 클래스>를 연결하는 역할
  • Django는 자동으로 관리자 화면을 구성해줍니다.
    • 데이터베이스에 대한 관리 기능을 위하여 프로젝트를 시작하는 시점에 관리자 화면을 제공합니다.
    • 이런 관리자 화면을 이용하여 web application에서 사용하는 데이터들을 쉽게 생성하거나 변경이 가능

Flask

  • Flask는 Python의 Micro framework를 기반으로 단순하고 매우 가벼운 web framework
  • URL 라우팅, Template, Cookie, Debugger 및 개발서버 등 기본 기능만을 제공
  • Flask는 단 10줄도 안되는 코드로 웹 서버를 구동할 수 있습니다.
    • 너무나도 간단합니다. from flask import Flask 를 시작으로 서버를 시작하는 코드까지 10줄이 되지 않습니다.
    • 물론 그만큼 최소한의 패키지로 구성되어있기때문에 Hello World는 간단히 구현 되지만, 상용 웹 서버를 구현할때는 단순하지만은 않습니다.
  • Flask에는 ORM (Object relational mapping) 기능이 제공되지 않습니다.
    • 그렇기 때문에, 개발자가 직접 SQLAlchemy 등 개발자에게 편하거나 익숙한 패키지를 설치하여 사용할 수 있습니다.

패키지 설치

> pip install flask
> pip install flask-restx

스샷

app.py : get()함수로 {"hello" : "world!"} 확인하기

  • 코드
# 첫 번째 Flask Server
from flask import Flask  # 서버 구현을 위한 Flask 객체 import
from flask_restx import Api, Resource  # Api 구현을 위한 Api 객체 import

app = Flask(__name__)  # Flask 객체 선언, 파라미터로 어플리케이션 패키지의 이름을 넣어줌.
api = Api(app)  # Flask 객체에 Api 객체 등록


@api.route('/hello')  # 데코레이터 이용, '/hello' 경로에 클래스 등록
class HelloWorld(Resource):
    def get(self):  # GET 요청시 리턴 값에 해당 하는 dict를 JSON 형태로 반환
        return {"hello": "world!"}

if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=80)
  • postman에서 확인해보기

app2.py : route의 url에 url pattern 사용해보기

  • 코드
from flask import Flask
from flask_restx import Resource, Api

app = Flask(__name__)
api = Api(app)


@api.route('/hello/<string:name>')  # url pattern으로 name 설정 => string형태의 name 변수에 값이 들어온다는 뜻
class Hello(Resource):
    def get(self, name):  # 멤버 함수의 파라미터로 name 설정
        return {"message": "Welcome, %s!" % name}


if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=80)
  • postman에서 확인해보기
  • status code와 Header가 잘 들어가 있음을 확인 가능

app3.py : GET, POST, PUT, DELETE

  • 코드
from flask import Flask, request # app.py, app2.py와 달리 request를 import해줌
from flask_restx import Resource, Api

app = Flask(__name__)
api = Api(app)

todos = {}
count = 1

@api.route('/todos')
class TodoPost(Resource):
    def post(self):
        global count
        global todos

        idx = count
        count += 1
        todos[idx] = request.json.get('data')

        return {
            'todo_id': idx,
            'data': todos[idx]
        }


@api.route('/todos/<int:todo_id>')
class TodoSimple(Resource):
    def get(self, todo_id):
        return {
            'todo_id': todo_id,
            'data': todos[todo_id]
        }

    def put(self, todo_id):
        todos[todo_id] = request.json.get('data')
        return {
            'todo_id': todo_id,
            'data': todos[todo_id]
        }

    def delete(self, todo_id):
        del todos[todo_id]
        return {
            "delete": "success"
        }


if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=80)
  • postman에서 확인해보기
    • post : json형식으로 parameter 전달 {"data" : "study"}
    • get : parameter 없이 http://localhost/todos/[todo_id입력] 형식으로 동작시킴
    • put : json형식으로 parameter 전달 {"data" : "studying"} & url은 http://localhost/todos/[todo_id입력] 형식으로 입력
    • delete : parameter 없이 http://localhost/todos/[todo_id입력] 형식으로 동작시킴

References

profile
oneofakindscene

0개의 댓글