앞에서 진행한 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
'학과공부' 카테고리의 다른 글
[데이터베이스] 과제를 위한 백엔드 공부 with flask - final (0) | 2023.11.10 |
---|---|
[데이터베이스] 과제를 위한 백엔드 공부 with flask - 5-1 (2) | 2023.11.09 |
[데이터베이스] 과제를 위한 백엔드 공부 with flask - 3 (0) | 2023.11.06 |
[데이터베이스] 과제를 위한 백엔드 공부 with flask - 2 (0) | 2023.11.01 |
[데이터베이스] 과제를 위한 백엔드 공부 with flask - 1 (0) | 2023.11.01 |