Flask는 파이썬을 사용해 작지만 간단하고 유연성있는 웹 어플리케이션을 만들 수 있습니다 :)
1. Flask
Micro Web Framwork
웹 프레임워크란 웹 어플리케이션을 개발할 수 있도록 Web Service와 Web API 등을 제공하고 웹 개발 과 배포를 할 수 있는 특정 방법을 제공하는 프로그램입니다.
Flask는 그중에도 Micro '최소한의 도구를 모아놓은 웹 프레임워크` 입니다.
#Django(장고)는 파이썬을 사용한 난이도있고 heavy한 웹 어플리케이션을 제작할 수 있는 또다른 프로그램입니다.
Flask 공식 사이트
flask.palletsprojects.com/en/1.1.x/
2. Flask 파이썬 설치
$ pip install Flask
Flask 사용법
1. 폴더와 파일 생성
flask_app
└── __init__.py
2. 파일 안에 코드 작성
#__init__.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
1) Flask 불러오기
2) 클래스 인스턴스 만들고 인수에 애플리케이션 모듈(또는 패키지)의 이름 입력하기
- __name__ : 응용프로그램으로 시작되었을 때
- __main__ : 모듈로 가져왔을 때
3) route() : 루트 주소 설정. 주소가 어떻게 끝나는지 알려주는 엔드포인트(endpoint)
4) 사용자의 브라우저에 표시하려는 메시지 반환하는 함수
3. CLI 실행
FLASK_APP=flask_app flask run
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) 문구가 실행되면 localhost:5000 사이트 접속
*개발자모드 CLI 실행 (새로고침으로 수정 확인 가능)
#code
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True)
$ export FLASK_ENV=development
$ flask run
4. ROUTE 기능
1) 라우팅
@app.route('/')
def index():
return 'Index Page'
@app.route('/hello') # URL 루트가 /hello 로 끝남
def hello():
return 'Hello, World'
2) 세부 엔드포인트
작업하는 username, index 등에 따라 해당 번호가 포함된 URL 리턴
엔드포인트 <변수값> 사용
from markupsafe import escape
@app.route('/user/<username>')
def show_user_profile(username):
# show the user profile for that user
return 'User %s' % escape(username)
@app.route('/post/<int:post_id>')
def show_post(post_id):
# show the post with the given id, the id is an integer
return 'Post %d' % post_id
@app.route('/path/<path:subpath>')
def show_subpath(subpath):
# show the subpath after /path/
return 'Subpath %s' % escape(subpath)
@app.route('/index/<num>')
def index_number(num):
return 'Welcome to Index %i' % int(num)
@app.route('/index/', defaults={ 'num' : 0 }) # defalts 값 적용
@app.route('/index/<num>')
def index_number(num):
return 'Welcome to Index %i' % int(num)
3) HTTP 메소드
URL에 액세스 할 떄 다른 HTTP method 사용
from flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return do_the_login()
else:
return show_the_login_form()
5. 블루포인트(bluepoint) 기능
route가 많이 생성될 때 하나의 파일로 모아서 사용하지 않고 기능별로 나눠서 사용.
# 또다른 폴더 생성
flask_app
├── __init__.py
└── routes
└── user_routes.py
# user_routes.py
from flask import Blueprint
bp = Blueprint('user', __name__, url_prefix='/user')
@bp.route('/')
def index():
return 'User index page'
# __init__.py 파일에서 블루프린트 파일 불러와 사용하기
from flask import Flask
from flask_app.routes import user_routes
app = Flask(__name__)
app.register_blueprint(user_routes.bp)
@app.route('/')
def index():
return 'Hello World!'
<bluepoint arguments>
- 'user' : 블루프린트의 명칭 지정
- __name__ : 블루프린트 모듈의 import 이름 지정
- url_prefix='/user' : URL 접두어 설정 (URL의 루트 앞에 '/user' 가 자동으로 붙게 됩니다.
<output>
웹 사이트 localhost:5000/user 에는 'User index page'가 출력됩니다.
웹 사이트 localhost:5000/ 에는 'Hello World!'가 출력됩니다.
6. Application Factory
프로젝트가 커지고 파일들이 많아지면 import를 사용할 일이 많아질 것 입니다.
파이썬에서의 circular import를 피하기 위해서 Flask는 어플리케이션 팩토리 패턴을 추천하고 있습니다.
Application Factiory는 '공장'을 세우는 것처럼 함수 안에 어플리케이션을 생성해 주어 사용할 수 있습니다.
블루프린트도 함수 내에서 import 해온 뒤 어플리케이션에 추가해줍니다.
#__init__.py
from flask import Flask
def create_app():
app = Flask(__name__)
from yourapplication.views.admin import admin
from yourapplication.views.frontend import frontend
app.register_blueprint(admin)
app.register_blueprint(frontend)
return app
if __name__ == "__main__":
app = create_app()
app.run()