Flask-RESTX로 Rest API 서버 구성 & Swagger 문서 작성 - 1

깃헙 레포: https://github.com/Comparelt/comparelt-api

 

GitHub - Comparelt/comparelt-api: The backend server with Flask & PostgreSQL

The backend server with Flask & PostgreSQL. Contribute to Comparelt/comparelt-api development by creating an account on GitHub.

github.com

대학교 팀 프로젝트에서 크롤링 웹서비스를 구성하게되었다.

주어진 기간이 길지않아서 백엔드를 구성하는데 많은 시간을 들일 수 없어서 Flask와 PostgreSQL로 빠르게 API 서버를 구축하였다. 

대략적으로 API 서버 기능을 명세하면 다음과 같다.

  • 로그인/회원가입
  • 원하는 단어에 대해 크롤링
  • 제품 검색

프론트엔드를 구성하는 팀에게 알려주기 위해 Swagger를 사용하여 API별 용도와 필수 파라미터, 입력 예시에 대해 문서화를 하기로 하였다. Flask-RESTX를 사용하면 Swagger와 flask-rest를 둘 다 사용할 수 있어 효율적으로 보였다.

 

Welcome to Flask-RESTX’s documentation! — Flask-RESTX 0.5.2.dev documentation

Welcome to Flask-RESTX’s documentation! Flask-RESTX is an extension for Flask that adds support for quickly building REST APIs. Flask-RESTX encourages best practices with minimal setup. If you are familiar with Flask, Flask-RESTX should be easy to pick u

flask-restx.readthedocs.io

API 서버를 구성하기 전에 Flask와 PostgreSQL를 연동할 필요가 있었다. flask_sqlalchemy와 config.ini를 통해 PostgreSQL을 연동하였다.

# config.ini
[DEFAULT]
SQLALCHEMY_DATABASE_URI: postgresql://postgres:asdf@localhost:5432/comparelt
# app.py
import configparser
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

config = configparser.ConfigParser()
config.read('../config.ini')

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = config['DEFAULT']['SQLALCHEMY_DATABASE_URI']  # To Connect to DB
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  # To avoid FSADeprecationWarning
db = SQLAlchemy(app)

if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=80)
# models.py
from api import db


class User(db.Model):
    __tablename__ = 'user'

    # declare User Table Columns
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String)
    email = db.Column(db.String)
    password = db.Column(db.String)

    def __init__(self, username, email, password):
        self.username = username
        self.email = email
        self.password = password

    def __repr__(self):
        return '<id {}>'.format(self.id)

    def serialize(self):
        return {
            'username': self.username,
            'email': self.email,
            'password':  self.password,
        }
#api/__init__.py

from flask_migrate import Migrate
from api.app import app, db
from api.user import models

migrate = Migrate(app, db)
flask db init # migrations 폴더가 생성된다.
flask db migrate # migrations를 데이터베이스에 적용한다.

Flask 서버를 시작하면, 다음과 같이 정상적으로 연동된 것을 볼 수 있다.

만약 다음과 같이 psycopg2가 없다고 ModuleNotFoundError: No module named 'psycopg2'고 뜨면, psycopg2를 설치해주면 된다. 

MacOS에서 psycopg2 설치에러가 발생하는 이슈에 대한 해결 방법은 해당 포스트에 정리해놓았다.

API 설계 및 구현은 다음 포스트에 이어서 하겠다.