플라스크는 프로젝트의 구조의 규칙이 존재하지 않는다. 따라서 프로젝트 구성에서 고민을 많이 해봐야한다.
플라스크 프로젝트 구조
이 실습에서 사용될 파이보 프로젝트의 구조이다.
├── pybo/
│ ├─ __init__.py
│ ├─ models.py
│ ├─ forms.py
│ ├─ views/
│ │ └─ main_views.py
│ ├─ static/
│ │ └─ style.css
│ └─ templates/
│ └─ index.html
└── config.py
pybo가 패키지로 변경되면서, 기존 pybo.py의 역할을 __init__.py가 대신 해주게 된다.
models.py
- 현재 진행하는 파이보 프로젝트는 ORM(object relational mapping)을 지원하는 파이썬 DB 도구인 SQLAlchemy를 사용한다. SQLAlchemy는 모델 기반으로 데이터 베이스를 처리하기 때문에 models.py에 모델 클래스를 정의할 것이다.
forms.py
- 파이보 프로젝트는 웹 브라우저에서 서버로 전송된 폼을 처리할 때 WTForms라는 라이브러리를 사용한다. 이 역시 모델 기반으로 폼을 처리하기에 forms.py에 폼 클래스를 정의할 것이다.
views
- views 디렉터리에는 뷰 파일들을 저장한다. (main_views.py, question_views.py 등)
static
- static 디렉터리에는 스타일 시트(.css), 자바스크립트(.js), 이미지 파일(.jpg, .png) 등이 저장된다.
templates
- 이 디렉터리에는 html파일을 저장한다.
config.py
- 파이보 프로젝트의 환경변수, 데이터베이스 등 환경 설정이 이 파일에 저장된다.
플라스크 애플리케이션 팩토리 사용
pybo.py에 작성했던 app = Flask(__name__) 코드를 보면 플라스크 앱은 Flask 클래스로 만든 객체라는 것을 알 수 있다.
플라스크는 app 객체를 사용해 여러 가지 설정을 진행하는데, 이 같은 방식으로 app 객체를 전역으로 사용하면 "순환 참조 오류"와 같은 문제가 발생할 확률이 높아진다.
이렇게 전역으로 객체를 사용할 때 발생하는 문제를 해결하기 위해 "애플리케이션 팩토리"를 사용할 것을 플라스크 공홈에서 알려준다.
1. pybo.py를 __init__.py 파일로 변경
먼저 아래 명령어로 projects, myproject 하위 디렉터리로 pybo를 만들어준다.
mkdir pybo
그 다음 pybo.py 를 pybo디렉터리 안 __init__.py로 넣어준다.
mv pybo.py pybo/__init__.py
2. 애플리케이션 팩토리 사용
__init__.py 파일을 create_app함수를 사용하는 방식으로 변경해준다.
from flask import Flask
def create_app():
app = Flask(__name__)
@app.route('/')
def hello_pybo():
return 'Hello, Pybo!'
return app
여기서 사용된 create_app 함수가 바로 애플리케이션 팩토리이다. 함수명인 create_app은 플라스크 내부에서 정의된 함수이므로 변경시 정상 작동하지 않는다.
마지막으로 flask run으로 터미널에 명령어를 입력하여 플라스크 서버가 잘 실행되는 것을 확인할 수 있다.
'Python > Flask' 카테고리의 다른 글
[Flask] 1. 플라스크 개발 준비(점프 투 플라스크 - Mac) (2) | 2021.11.03 |
---|