본문 바로가기

학과공부

[데이터베이스] 과제를 위한 백엔드 공부 with flask - 4

앞에서 진행한 pybo/__init__.py 파일 내용을 보면,

create_app 함수안에 hello_pybo 함수가 포함되어 있다. 

 

 hello_pybo 함수는 / URL과 매핑되는 함수인데,

이러한 URL 매핑을 @app.route('/')라는 애너테이션이 만들어 준다.

 

이때 @app.route와 같은 애너테이션으로 URL을 매핑하는 함수를 라우팅 함수라고 한다.

 

 

그런데, 지금까지 작성한 대로라면

새로운 URL 매핑이 필요할 때마다

라우팅 함수를 create_app 함수 안에 계속 추가해야 한다.

 

라우팅 함수가 계속 추가된다면,

create_app 함수는 엄청나게 크고 복잡한 함수가 될 것이다.

 

블루프린트(Blueprint)를 사용하면 함수가 복잡해지는 문제를 해결할 수 있다.

 

플라스크의 블루프린트를 이용하면 라우팅 함수를 체계적으로 관리할 수 있다.

블루프린트(blueprint)는 (보통 객체지향 프로그래밍에서) "청사진"을 뜻하는 용어인데

플라스크에서는 URL과 함수의 매핑을 관리하기 위해 사용하는 도구(클래스)이다.

 

create_app 함수 안에 포함된 hello_pybo 함수 대신 블루프린트를 사용할 수 있도록 수정해 보자.

 

그리고 views 디렉터리에 main_views.py 파일을 다음과 같이 작성하자.

 

이 코드는 pybo/__init__.py 파일의 create_app 함수 안에 있던 hello_pybo 함수를

main_views.py 파일에 그대로 옮긴 것이다.

단, 애너테이션이 @app.route에서 @bp.route로 변경되었다 이 변화에 주목하자. 

@bp.route에서 bp 객체는 다음처럼 생성되었다.

bp 객체 생성시 사용된 __name__은 모듈명인 "main_views"가 인수로 전달된다.

첫번째 인수로 전달한 "main"은 블루프린트의 "별칭"이다.

이 별칭은 나중에 자주 사용할 url_for 함수에서 사용된다.

그리고 url_prefix는 라우팅 함수의 애너테이션 URL 앞에 기본으로 붙일 접두어 URL을 의미한다.

예를 들어 main_views.py 파일의 URL 프리픽스에 url_prefix='/' 대신 url_prefix='/main'이라고 입력했다면

hello_pybo 함수를 호출하는 URL은 localhost:5000/이 아니라 localhost:5000/main/이 된다.

 

 

이제 플라스크 앱에 작성한 블루프린트를 등록해 보자. pybo/__init__.py 파일을 다음과 같이 수정하자.

 

블루프린트가 잘 동작하는지 확인하기 위해 라우팅 함수를 조금 바꾸어보자.

main_views.py 파일을 열어 hello_pybo 함수의 URL 매핑을 /에서 /hello로 바꾸고,

index 함수를 추가해 / URL로 매핑해 보자.

 

실행하여 확인해보면 잘 작동 된다

 

 

 [http://localhost:5000 페이지요청]

 

 

[http://localhost:5000/hello 페이지요청]

localhost:5000에 접속하면 / URL에 매핑된 index 함수가 호출되어 "Pybo index"가 출력되고, 

localhost:5000/hello에 접속하면 /hello URL에 매핑된 hello_pybo 함수가 호출되어 "Hello, Pybo!"가 출력된다.

이제 라우팅 함수가 추가되더라도 main_views.py 파일에 함수를 추가하면 되기 때문에

create_app 함수가 뚱뚱해질 일을 걱정할 필요는 없다.

 

 

 

 

출처: https://wikidocs.net/81510

 

2-03 블루프린트로 라우팅 함수 관리하기

* `[완성 소스]` : [github.com/pahkey/jump2flask/tree/2-03](https://github.com/pahkey/jump2flask/tree/2-…

wikidocs.net