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

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

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

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

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

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

로그인/회원가입

원하는 단어에 대해 크롤링

제품 검색

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

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 ''.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 설계 및 구현은 다음 포스트에 이어서 하겠다.

from http://eight20.tistory.com/41 by ccl(A) rewrite - 2021-10-20 08:27:39