Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- Spring Security
- web server
- 데이터베이스
- 백엔드
- 배포
- Spring
- computer science
- 스프링 배치
- HTTP
- CI/CD
- virtualization
- 도커
- 영속성 컨텍스트
- CS
- vm
- mysql
- ORM
- JPA
- 컨테이너
- 웹 서버
- Java
- 자바
- 스프링 부트
- spring boot
- 스프링
- 가상화
- spring cloud
- spring batch
- 스프링 시큐리티
- Container
Archives
- Today
- Total
개발 일기
[Flask] Blueprints 블루프린트 본문
하나 디지털 파워온에서 'OCR과 머신러닝 기술을 활용한 전세사기 예방 경고 서비스'라는 주제로 최종 프로젝트를 진행하게 됐다.
해당 서비스를 구현하는데에 있어서 머신러닝 모델을 돌리고, 파인튜닝 모델을 처리하며, GPT API와 Clova OCR API를 다루는 데 있어 Python이 Spring Boot(Java)보다 더 유리하다고 판단하여 Flask 서버를 구성하게 되었다.
이전에 https://ai-back-end.tistory.com/84 이 대회에서 플라스크 서버를 구축했을 때는 API가 딱 2개만 나올 것같아서 server.py에 모든 코드를 집어넣고 처리 했었다. 그러나 조금 더 다양한 비즈니스 로직과 데이터베이스 연동 등이 필요했고 하루만에 끝내는 해커톤이 아닌 3개월 간 개발이 필요한 서비스 였기 때문에 파일을 분리하여 유지보수성을 올릴 필요성을 느꼈다. 그래서 디렉토리를 구성할때 분리하기 위해 이 Blueprints라는 개념을 쓰게 되었고 정리하게 됐다.
Blueprints란?
- Flask에서 Blueprint는 하나의 플라스크 애플리케이션을 분리된 모듈로 구성할 수 있도록 해주는 객체.
- 예를 들어, 데이터베이스 설정과 여러 API 기능(게시판, 마이페이지 etc) 등을 각각 별도의 파일 또는 모듈로 나누고, 이를 Blueprint를 통해 관리하면, 코드의 유지 보수성과 확장성이 크게 향상.
- 큰 애플리케이션을 여러 작은 단위로 나누어 관리할 수 있고, 다양한 설정 및 라이브러리의 등록도 Blueprint를 통해 쉽게 관리할 수 있다.
# app.py (Blueprint 미사용)
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/', methods=['GET'])
def home():
return 'Server is running!'
@app.route('/example', methods=['POST'])
def example():
data = request.json
return jsonify({"message": "Example response", "data": data}), 200
if __name__ == '__main__':
app.run(debug=True)
# ------------------------------------------------------------------------ #
# app.py (Blueprint 사용)
from flask import Flask
from blueprints import api_bp
app = Flask(__name__)
# Blueprint 등록
app.register_blueprint(api_bp)
if __name__ == '__main__':
app.run(debug=True)
# blueprints.py (Blueprint 정의)
from flask import Blueprint, request, jsonify
api_bp = Blueprint('api_bp', __name__)
@api_bp.route('/', methods=['GET'])
def home():
return 'Server is running!'
@api_bp.route('/example', methods=['POST'])
def example():
data = request.json
return jsonify({"message": "Example response", "data": data}), 200
주요 기능
- URL 규칙 설정: 각 Blueprint에 접두어나 서브도메인을 설정하여 URL 규칙을 세부적으로 관리할 수 있다.
profile_bp = Blueprint('profile', __name__, url_prefix='/profile')
- URL 핸들러 설정: Blueprint별로 before_request나 after_request와 같은 요청 전후 처리 핸들러를 설정할 수 있습니다.
# admin.py
from flask import Blueprint, request
admin_bp = Blueprint('admin', __name__, url_prefix='/admin')
@admin_bp.before_request
def check_admin():
# 관리자가 아니면 접근 금지
if not request.args.get('is_admin'):
return "Access Denied: Admins Only", 403
@admin_bp.route('/')
def admin_dashboard():
return "Welcome to Admin Dashboard"
- 정적 파일 및 템플릿 관리: Blueprint는 각자 자신만의 정적 파일과 템플릿 폴더를 가질 수 있어 모듈화된 애플리케이션 구조에 유리
# blog.py
from flask import Blueprint, render_template
blog_bp = Blueprint('blog', __name__, template_folder='templates', static_folder='static')
@blog_bp.route('/')
def blog_home():
return render_template('blog_home.html')
Blueprint의 장점
- 모듈화: 각 기능별로 코드가 분리되어 유지보수가 쉬워진다. 예를 들어, 프로필 관리, 게시판 기능, 인증 등은 각각 다른 파일이나 모듈에 구현할 수 있다.
- 코드의 재사용성: Blueprint를 사용하면 동일한 구조를 다른 프로젝트나 부분에서 재사용할 수 있다. 각 블루프린트는 독립적으로 동작하므로 손쉽게 추가하거나 제거할 수 있다.
- 확장성: 큰 프로젝트에서 여러 기능을 독립적으로 관리하고 필요에 따라 각 모듈을 쉽게 추가, 제거할 수 있다. 또한 블루프린트는 서브도메인을 통해 더욱 정교한 URL 관리를 가능하게 한다.
- URL 관리의 간편함: Blueprint는 URL을 모듈 단위로 관리할 수 있도록 하여, 복잡한 URL 구조를 깔끔하게 정리할 수 있다.
.(root)
|ㅡ main
|ㅡ __init__.py
|ㅡ templates
|ㅡ *.html 파일들
|ㅡ apis
|ㅡ __init__.py
|ㅡ board.py
|ㅡ member.py
|ㅡ ...
|ㅡ app.py
|ㅡ config.py
최종적으로 구성한 디렉토리 구성이다.
'Back-End > Flask (Python)' 카테고리의 다른 글
[Flask] __pycache__ (0) | 2024.09.29 |
---|