api 서버 구축을 위한 라이브러리 탐색
시스템 개발을 하는데 내부적으로 자연어처리를 돌려야 하는 상황이라 파이썬을 사용한 api 구축이 필요한 상황이 됐다.
물론 다른 언어를 사용해서 내부로직화 할 수는 있지만 개발 초기다 보니, 파이썬으로 변경하는 편이 빠를것 같아 선택했다.
내가 찾아본 라이브러리는
총 5개로
Flask, FastAPI, Django Rest Framework, Bottle, Falcon
이다.
각기 라이브러리의 장, 단점과 기본적인 형태를 알아보았다.
Flask
- 최소한의 코어기능, 필요한 기능은 확장을 통해 추가.
- 데코레이터를 사용한 라우팅
- Jinja2 템플릿 엔진 사용
- ORM, 인증, 세션관리 등 다양한 확장 패키지 사용 가능
*유연하고 확장가능하여 프로토타입에 적합
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/api', methods=['GET'])
def api():
data = {"message": "Hello, World!"}
return jsonify(data)
if __name__ == '__main__':
app.run(debug=True)
FastAPI
- 비동기 기능 지원, Pydantic을 사용한 데이터 검증
- Falsk와 유사한 데코레이팅 방식으로 라우팅하여, 경로 파라미터와 쿼리 파라미터를 타입힌트를 통해 자동 처리
- Swagger UI와 ReDoc를 통한 자동 API 문서화
*비동기 프로그래밍 지원, 빠른 개발속도, 높은 성능
from fastapi import FastAPI
app = FastAPI()
@app.get('/api')
def read_root():
return {"message": "Hello, World!"}
if __name__ == '__main__':
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
Django Rest Framework
- Django의 ORM, 인증, 권한관리 등과 통합된 구조
- URL 패톤을 통한 라우팅, ViewSet을 통한 CRUD 기능 자동화
- Serializer 클래스를 통한 데이터 직렬화 및 역직렬화 처리
*Django의 ORM및 기타 기능들과 통합이 용이
from django.urls import path
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
class HelloWorld(APIView):
def get(self, request):
return Response({"message": "Hello, World!"}, status=status.HTTP_200_OK)
urlpatterns = [
path('api/', HelloWorld.as_view(), name='hello_world')
]
Bottle
- 단순한 코어구조로 단일 파일로 운영 가능
- 데코레이터를 사용한 라우팅
- SimpleTemplateEngine 사용
*간단한 프로젝트에 적합
from bottle import Bottle, run, response
app = Bottle()
@app.route('/api')
def api():
response.content_type = 'application/json'
return {"message": "Hello, World!"}
if __name__ == '__main__':
run(app, host='0.0.0.0', port=8080)
Falcon
- 단순한 코어구조
- URL 템플릿을 사용한 라우팅
- reponse, redicrect를 직접처리
*고 트래픽에 적합함.
import falcon
class HelloWorldResource:
def on_get(self, req, resp):
resp.media = {"message": "Hello, World!"}
app = falcon.App()
app.add_route('/api', HelloWorldResource())
if __name__ == '__main__':
from wsgiref.simple_server import make_server
with make_server('', 8000, app) as httpd:
print('Serving on port 8000...')
httpd.serve_forever()
여기서 내 선택은 FastAPI였는데, 다른것보다 docs 페이지를 만들어 주는 부분이 매우 편리했던게 크다..
댓글