[Flask] 초기세팅

김영환·2020년 12월 27일
0
post-thumbnail

(주)브랜디와 기업협을 하면서 플라스크 프레임워크를 사용하기로 결정한 후 나느 admin2 의 역할을 수행하기위해서 초기세팅을 진행해보았다.

우선 플라스크는 장고와 다르게 프레임워크자체에서 모든것을 처음부터 다 해줘야됬고, MVC패던에 맞게 프로젝트의 초기설계를 해야됬다.

백앤드의 api의 아키텍처에는 여러가지가 있을것이지만 가장 널리 사용되는 레이어드 아키텍처에 맞게 프토젝트를 3가지 section으로 나눈다.

view
프로젝트에서 backend endpoint경로를 처리해주는 부분이다. 플라스크에서는 flask 클래스가 route라는 메서드를 가지고 있고 이를 통해서 클라이언트에게서 온 requestf를 처리한다

service
api에서 로직을 담당하는 영역이고, 300자이상의 글을 저장시키지 않겠다고 하면 service영역에서 이를 걸러주는 로직이 추가되어야된다.

model
데이터베이스와 직접적으로 통신하는 영역이다.

Blueprint

블루프린트를 이해하기위해서는 api의 경로를 설정해주는 백앤드의 가장 앞쪽에 위치하는 view를 살펴봐야한다. 클라이언트에게서 온 요청을 처리하는 영역으로 엔드폰인트를 정의하는 곳이다. 플라스크에서는 blueprint라는 기능을 지원하다. blueprint는 청사진이라는 뜻을 가지는 단어로 우선적으로 엔드포인트 경로를 설정해준다.

app.py

app.py에서는 서버가 실행되면 플라스크 프로젝트를 만들어주는 역할을 한다.

def create_app(test_config=None):
    app = Flask(__name__)
    app.debug = True
    CORS(app, resources={r'*': {'origins': '*'}})

    if test_config is None:
        app.config.from_pyfile("config.py")
    else:
        app.config.update(test_config)

    database = app.config['DB']
    
    # persistence Layer
    sample_user_dao = SampleUserDao()
    # business Layer
    services = Services
    services.sample_user_service = SampleUserService(sample_user_dao)
    # presentation Layer
    create_endpoints(app, services, database)

[1] 플라스크 클래스를 인스턴스로 만들어준다. 그리고 프로젝트가 실행될 때 꼭 들어가야할 json_encoder, make_config, CORS와 같은 함수, 메서드들을 실행해준다.

manage.py

플라스크 프로젝트가 실행되는 곳

from app import create_app

if __name__ == "__main__":
    app = create_app()
    app.run(host="0.0.0.0", port=5000)

[1]파이썬에서 __name__ 은 타입된 모듈의 이름이다. 다른파일에서 import되어 실행되지 않고 이 모듈 자체를 실행하면 __name____main__ 이 된다.
[2]app.py에 있는 create_app함수를 실행해서 나온 리턴값인 플라스크 인스턴스를 변수에 담아준다.
[3]플라스크 인스턴스를 로컬호스트 5000번 포트로 run해준다.

결론적으로, manage.py를 shell에서 직접 실행하면 app.py에 있는 create_app 함수가 5000번 포트로 로컬에서 실행된다

connection.py

각 영역 연결을 관리하는 모듈을 따로 만들어준다.

import pymysql

def get_connection(database):
    connection = pymysql.connect(host=database['host'],
                                 user=database['user'],
                                 password=database['password'],
                                 db=database['name'],
                                 charset=database['charset'])
    return connection

0개의 댓글