Flask는 Python 웹 프레임워크로, 가볍고 간단하면서도 확장성이 높아 인기가 많은 웹 프레임워크다.
Flask로 간단한 웹 서비스를 만들어 봤었고 이것에 대해서 조금 더 기능을 설명하면서 기록하기 위해 작성해본다.
Flask 설치
Flask를 사용하기 위해서는 먼저 Flask를 설치해야 해야 한다. pip 으로 Flask를 설치한다.
pip install flask
Hello World 페이지 만들기
간단한 Hello World가 표시되는 웹 페이지를 만들어볼 수 있다.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
위 코드를 실행하면, http://127.0.0.1:5000 주소로 접속하여 "Hello, World!" 문구가 출력된다.
위 코드를 간단하게 설명하면 다음과 같다.
- Flask 모듈을 불러와 app 객체를 생성
- @app.route('/') 데코레이터를 사용하여 '/' 경로로 접근할 때 hello 함수가 실행
- hello 함수는 "Hello, World!" 문자열을 반환
- app.run()을 통해 Flask 애플리케이션이 실행
설정 파일 분리하기
애플리케이션 설정은 보통 애플리케이션 코드와 분리하여 관리한다.
Flask에서는 config.py 파일을 만들어 애플리케이션 설정을 관리할 수 있다.
class Config:
DEBUG = False
TESTING = False
SECRET_KEY = 'mysecretkey'
class ProductionConfig(Config):
pass
class DevelopmentConfig(Config):
DEBUG = True
class TestingConfig(Config):
TESTING = True
위 코드에서는 Config 클래스를 정의하고, 이를 상속받은 ProductionConfig, DevelopmentConfig, TestingConfig 클래스를 정의한다. Config 클래스에서는 DEBUG, TESTING, SECRET_KEY 변수를 정의하고, 각각의 하위 클래스에서 필요한 변수만 값을 변경해 사용한다.
애플리케이션에서 설정 파일을 사용하려면 다음과 같이 app.config.from_object() 메소드를 사용한다.
from flask import Flask
app = Flask(__name__)
app.config.from_object('config.DevelopmentConfig')
@app.route('/')
def hello():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
위 코드에서는 app.config.from_object() 메소드를 사용하여 config.DevelopmentConfig 클래스를 사용하도록 설정한다.
config.py 파일의 DevelopmentConfig 클래스에서는 DEBUG 변수를 True로 설정했으므로, app 객체가 생성될 때 config.DevelopmentConfig 클래스에서 정의한 설정을 사용하게 된다.
환경 변수로 설정 분리하기
때로는 애플리케이션 설정을 환경 변수를 통해 분리하여 관리해야 하는 경우가 있다.
Flask에서는 os.environ 딕셔너리를 사용하여 환경 변수를 읽어와 애플리케이션 설정으로 사용할 수 있다.
import os
from flask import Flask
app = Flask(__name__)
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', 'mysecretkey')
@app.route('/')
def hello():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
위 코드에서는 os.environ.get() 메소드를 사용하여 SECRET_KEY 환경 변수 값을 읽어오고, 환경 변수에 SECRET_KEY가 없으면 기본값으로 mysecretkey를 사용한다.
Blueprint를 이용한 모듈화
Flask 앱은 기능별로 모듈화하여 개발할 수 있는데, 이때 Blueprint 객체를 이용하여 모듈화할 수 있다.
블로그라고 예를 들면, 사용자 관리와 관련된 기능은 users 모듈에서 개발하고 블로그 관리와 관련된 기능은 blog 모듈에서 개발할 수 있다.
# users/views.py
from flask import Blueprint
users = Blueprint('users', __name__)
@users.route('/')
def index():
return 'Users Index'
@users.route('/login')
def login():
return 'Users Login'
# blog/views.py
from flask import Blueprint
blog = Blueprint('blog', __name__)
@blog.route('/blog')
def index():
return 'Blog Index'
@blog.route('/create')
def create():
return 'Blog Create'
위 코드에서는 users와 blog 블루프린트를 정의하고, 각각의 블루프린트에서 필요한 라우트를 정의한다.
이제 메인 앱에서는 다음과 같이 users와 blog 블루프린트를 등록하여 사용할 수 있다.
from flask import Flask
from users.views import users
from blog.views import blog
app = Flask(__name__)
app.register_blueprint(users)
app.register_blueprint(blog)
if __name__ == '__main__':
app.run()
위 코드에서는 users.views와 blog.views 모듈에서 정의한 users와 blog 블루프린트를 app.register_blueprint() 메소드를 사용하여 등록했다.
이제 http://localhost:5000/, http://localhost:5000/login, http://localhost:5000/blog, http://localhost:5000/create 경로로 접근할 때 각각의 블루프린트에서 정의한 라우트가 실행된다.
정적 파일 사용하기
Flask에서는 정적 파일과 템플릿을 사용하여 동적인 웹 페이지를 구현할 수 있다.
정적 파일은 CSS, JavaScript, 이미지 등과 같이 서버에서 변하지 않는 파일을 의미한다.
Flask에서는 static 폴더를 만들어 정적 파일을 관리한다.
from flask import Blueprint
users = Blueprint('users', __name__)
@users.route('/')
def index():
return '<img src="/static/logo.jpg">'
@users.route('/login')
def login():
return 'Users Login'
위 코드에서는 index 라우트에서 /static/logo.png 경로로 이미지 파일을 불러오는 코드이다.
이때, static 폴더는 애플리케이션의 루트 폴더에 위치해야 한다.
템플릿 사용하기
템플릿은 HTML 문서를 동적으로 생성하기 위해 사용한다. Flask에서는 templates 폴더를 만들어 템플릿을 관리한다.
from flask import Blueprint, render_template
users = Blueprint('users', __name__)
@users.route('/')
def index():
return render_template('index.html',
name='Hong',
img='/static/logo.jpg')
@users.route('/login')
def login():
return 'Users Login'
위 코드에서는 render_template() 함수를 사용하여 templates/index.html 파일을 불러와 name 변수와 img 변수를 전달한다. index.html 파일에서는 {{ name }}, {{ img }} 템플릿 태그를 사용하여 name, img 변수를 출력한다.
<!DOCTYPE html>
<html>
<head>
<title>Flask</title>
</head>
<body>
<h1>Hello, {{ name }}!</h1>
<img
width=200px
height=200px
src="{{ img }}">
</body>
</html>
이제 http://localhost:5000/ 경로로 접근하면 Hello, Hong! 문구와 로고 이미지가 아래와 같이 출력된다.
마무리
이 글에서 Flask 웹 프레임워크를 사용하여 간단한 웹 서비스를 만드는 방법을 소개했다.
Flask 설치부터 시작하여 Hello World 페이지를 만들고,
설정 파일을 분리하며 환경 변수를 사용하는 방법을 간단하게 구현해봤다.
또한, Blueprint를 이용한 모듈화, 정적 파일 사용, 템플릿 사용 등의 기능을 다뤄봤다.
'Python > Flask' 카테고리의 다른 글
Flask 백엔드 서버 Synology NAS 배포기 (0) | 2023.08.23 |
---|