본문 바로가기
CODING/Python

[Python/Flask] flask-restx를 이용한 CRUD구현 (2) : 기본 설정 및 파일 분리하기

by 밍톨맹톨 2021. 11. 24.
728x90
728x90

파일을 분리해서 쓰기 위해 아래의 구성을 가지도록 일단 수정해보도록 할 것이다.

추후 DB 연결하고 데이터 입력 형태가 필요할 때 model 폴더도 만들어서 따로 관리할 예정

- Config : 설정을 모아놓은 폴더

- Controller : CRUD를 구현할 폴더 

- app.py : namespace 추가 및 Flask 객체를 선언하는 파일

- run.py : 실행을 위한 파일 


기존의 app.py에 있는 코드들을 위와 같이 분리해볼 것이다. 

 

1. Config/config.py

아직 설정에 필요한 아이들이 크게 없기 때문에 

config.py를 만들고 아래와 같이 작성했다. 

이 부분은 굳이 필요한 부분은 아니니까 Pass

 

PORT = 5000
HOST_IP = '0.0.0.0'

 

2. app.py

app.py에는 파일을 실행시키면 나오는 swagger 창에 기본을 꾸며주는 역할을 하는데 

Api에서 title은 빨간 박스 부분에 해당하고 description에는 간단한 API에 대한 설명을 쓰면 된다. 

 

그 밑에 api.add_namespace(memo.Memo, '/memo') 부분은

Contoller 폴더에 있는 memo파일에 있는 Namespace를 실행하면 저 path로 실행된다.

[ code ]

더보기
from flask import Flask
from flask_restx import Api  # 빨간 줄이라도 상관없음

from Controller import memo

def create_env():
    app = Flask(__name__)  # Flask 객체 선언
    api = Api(app, version=1.0, title="Memo", description="간단한 memo CRUD")  # Flask 객체에 Api 객체 등록

    # namespace 추가
    api.add_namespace(memo.Memo, '/memo')
    return app

 

3. run.py

이 모든 것을 실행하는 파일 

앞으로 이 프로젝트를 실행할 때 터미널에서

[ 가상환경 ON ➡️ 프로젝트 폴더로 이동[필자는 CRUDProject] ➡️ python3 run.py]

 

app.py 파일을 import 해주고 안에 있는 create_env 함수에서 app을 반환하기 때문에 그 뒤에 .run함수와

config.py에서 import 한 PORT 번호와 HOST_IP를 넣어주면 된다. 

import app
from Config.config import PORT, HOST_IP

if __name__ == "__main__":
    app.create_env().run(HOST_IP, port=PORT, debug=True)

 

4. Controller/memo.py

4 번째 줄과 같이 flask_restx에서 제공하는 Namespace를 통해 아래와 같이 만들 수 있다. 

 

사진과 비교해보면 어디가 뭘 의미하는 지 알 수 있다. 

 

Namespace를 선언하고 나면 Namespace에서 사용할 수 있는 model(데이터 받는 부분)을 만들 수가 있는데 간단하게 문자열을 받기 위해  fields.String을 만들어주었다. 

그렇게 하고나면 화면에 저렇게 models 밑에 해당하는 데이터 형태가 나온 것을 볼 수 있다.

제공하는 데이터 형태는 Link를 참고

 

생성할 때는 9 번째 줄에 의해 '/new'라는 path로 들어가게 되고 최종적으로는 '/memo/new' 이런 식으로 아래와 같이 나온다. 

나오게 된다 

 

@Memo.expect를 통해 위에서 사용했던 데이터 형태를 쓰겠다고 선언하고 나면 

화면이 json 형태로 body가 나오게된다. 

 

try it out을 누르고 string 부분을 원하는 글자로 바꾼 뒤 execute를 누르고 나면

return한 memo의 value 값이 나오게 된다. 

[ CODE ]

더보기
from flask import request
from flask_restx import Api, Resource, Namespace, fields

Memo = Namespace("About Memo", description="간단한 Memo CRUD 관련된 API")

memo_model = Memo.model('memo_model', {
    'memo': fields.String(description='example', required=True),
})
@Memo.route('/new')
class MemoCreate(Resource):
    @Memo.expect(memo_model)
    def post(self):
        result = request.json.get('memo')
        return result

 


일단 한 파일에서 모든 일을 처리하지 않기 위해 폴더를 나누었지만 사실은 간단한 flask를 사용한 CRUD 구현을 위한 프로젝트기 때문에 굳이 이 과정은 하지 않아도 된다. 그렇지만 추후에 프로젝트가 커질 때를 대비해서 미리 분해하는 것~ 

728x90

댓글