파일을 분리해서 쓰기 위해 아래의 구성을 가지도록 일단 수정해보도록 할 것이다.
추후 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 구현을 위한 프로젝트기 때문에 굳이 이 과정은 하지 않아도 된다. 그렇지만 추후에 프로젝트가 커질 때를 대비해서 미리 분해하는 것~
'CODING > Python' 카테고리의 다른 글
[Python] 데이터 분석 자주 쓰는 코드 모음 (1) 판다스, 그래프, 상관계수 (0) | 2022.08.14 |
---|---|
[Python] 딕셔너리와 리스트 비교 / Dictionary | List (0) | 2022.07.30 |
[Python/Flask] flask-restx를 이용한 CRUD구현 (1) : 가상환경 설치하기 (0) | 2021.11.23 |
[Python] - 딕셔너리 key, value 서로 위치 바꾸는 법 (0) | 2021.11.05 |
[Python/Django] Mac 장고 venv로 가상환경 생성 (0) | 2021.08.08 |
댓글