지금까지 프로젝트를 진행하면서 모든 소스를 app.py에 모아서 작성했는데 기능이 추가될 수록 복잡해져서 여러 가지 파일로 나눠서 사용할 수 없을까? (자바 Controller처럼) 방법을 찾아보다가 이럴 때 사용하는 게 바로 블루프린트라는 것을 알게 되었다!
블루프린트(Blueprint)란?
- Flask에서 제공하는 라이브러리
- 각 페이지 혹은 기능에 맞게 분류해서 사용할 수 있게 해준다.
- 큰 애플리케이션을 단순화시키고 확장 프로그램과 라이브러리 등록을 위한 중심 수단으로도 사용된다.
먼저 프로젝트 구조를 Flask Blueprint 구조에 맞춰 변경했다. 원래 각 파일을 폴더별로 나누었는데 파이썬 파일은 모두 바깥으로 빼놓고 가장 상위에 run.py 그리고 __init__.py를 추가했다. 대충 요렇게
stockping
├── app //모든 소스를 app 폴더에 집어넣음
│ ├── home.py //메인
│ ├── news.py //뉴스
│ ├── topfifty.py //top50 종목 <!-- 기능별로 파이썬 소스 분류 -->
│ ├── __init__.py
│ ├── stock
│ │ ├── getStock.py
│ │ ├── stock_token_control.py
│ │ ├── insert_stock_code_.py
│ ├── static //static 폴더
│ ├── templates //템플릿 폴더
├──run.py
블루프린트 사용법
1. run.py
run.py 에서는 app 폴더에서 __init__에 선언된 app 객체를 가져와 실행
from app import app
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000 , debug=True)
2. __init__.py
__init__.py 파일에선 app 객체를 선언하고 각종 모듈, 데이터베이스, 블루프린트 값을 설정한다.
creat_app() 함수는 flask에서 제공하는 기본 함수이기 때문에 반드시 저 명칭으로 선언해야 한다.
from flask import Flask, render_template, send_from_directory
import json
import urllib.request
import urllib.parse
import cx_Oracle
import os
from bs4 import BeautifulSoup as bs
import requests
from jinja2 import Template
# 대충 상위에는
# config 파일이랑 DB 정보 작성
#__init__.py 파일에선 app 객체를 선언하고 각종 모듈, 데이터베이스, 블루프린트 값을 설정한다.
# 플라스크 프레임워크에서 지정한 함수 이름
def create_app():
app = Flask(__name__)
from . import home
from . import topfifty
app.static_folder = "../static"
app.register_blueprint(home.blueprint) #home.py에서 사용할 blueprint 객체를 blurprint로 설정
app.register_blueprint(topfifty.blueprint)
return app
3. run이랑 __init__ 파일까지 작성했으면 이제 각 기능이나 화면에 따라 파이썬 파일을 분류해서 작성하고 각 파일에서 블루프린트 객체를 만들면 된다!
우리 프로젝트 주요 기능은 메인 화면, 뉴스, 주식, 로그인, 게시판 정도라 이렇게 나눌 예정이고 예시로 메인 화면에 해당하는 home.py를 살펴보면 아래와 같다.
from app import * #app에 선언된 모든 값을 가져온다.
from flask import Blueprint
app = Flask(__name__)
blueprint = Blueprint("home", __name__, template_folder="templates", static_folder="static", url_prefix="/")
@blueprint.route('/main', methods=['GET', 'POST'])
def index():
# 소스 생략
return render_template('index.html')
4. 요약 정리하자면
- run.py, __init__.py를 각 양식에 맞춰 작성한다.
- 기능별로 파이썬 파일을 나누고 각 파일에 블루프린트 객체 선언한다.
blueprint = Blueprint()
- 위에서 선언한 블루프린트 이름 그대로 __init 파일에 블루프린트 객체를 등록한다.
app.register_blueprint(home.blueprint) #home.py에서 사용할 blueprint 객체를 blurprint로 설정
- 각 기능별 파일에서는 main에서 *를 불러오고 블루프린트로 라우팅해 동작하도록 한다.
- url_for() 함수로 리다이렉트를 넘길 때 함수 앞에 블루프린트 객체 이름을 붙여줘야 한다.
예를 들면, 메인 화면에서 로고를 클릭 시 메인 화면으로 리다이렉트 시키도록 구현했는데 아래와 같이
또 이렇게 하나의 기능 공부 완료~
'💻 my code archive > 📘Python' 카테고리의 다른 글
[Stockping #4] Python 파이썬 BeautifulSoup 실시간 코스피, 코스닥 네이버 금융 웹 크롤링 (0) | 2022.11.17 |
---|---|
[Stockping #3] Python 파이썬 DB 데이터 SELECT, Flask 화면 뿌리기 (0) | 2022.11.17 |
[Stockping #2] 수집한 뉴스 데이터 Oracle DB 저장(INSERT), 파이썬 오라클 연동, 오라클 19c 설치 (0) | 2022.11.08 |
[Stockping #1] 파이썬 네이버 뉴스 데이터 수집하기 (0) | 2022.11.08 |