오늘부터 Flask 시작!
참고 자료
- 점프 투 플라스크
- 깔끔한 파이썬 탄탄한 백엔드 (저자 : 송은우)
Flask는 python 기반의 framework이다. framework와 library의 개념이 헷갈릴 수 있는데 물론 공통점도 있지만 엄연히 다른 개념이다.
Framework && Library
- 필요한 기능을
재사용 가능
하도록 구현해 놓았다
Framework | Library
- Framework는 framework가 개발자의
코드를
실행하는 개념- Library는 개발자의
코드 안에서
실행되는 개념
하나의 프로젝트당 하나의 가상환경
어떻게 보면 같은 환경일 프로젝트이지만 굳이 하나를 더 만들어 주는격일수도 있다. 그치만 어떤 프로젝트에 어떤 가상환경인지 모두 기억하기가.. 어려우므로 나의 경우 해당 프로젝트 이름으로 가상환경을 만들어 준다. (이후 연습용 프로젝트였을 경우 삭제해주면 되지!)
바로 pip install flask
해주기.
pybo ?
"파이썬 게시판을 영어로 하면 Python Board, 이것을 축약하여 pybo라고 명명했구요
그래서 한글로 발음하면 파이보입니다."
출처 : Pybo
간단하게 작성한 파일이다.
먼저 pip install flask
로부터 FLASK class를 import 한다.
app = Flask(__name__)
: flask application을 생성하는 코드__name__
: file이 실행될때 실행되는 모듈이 담기는 변수 즉, 여기서는 pybo가 담긴다. (pybo.py 라는 모듈이 실행되므로!)@app.route
()안의 주소에 접속하면 그 바로 아랫줄에 있는 함수를 호출하는 flask의 decorator 이다.기존에 Django는 python manage.py runserver
로 끝났다. 하지만.. 저 문장하나로 여러가지를 지원해주어서 바로 runserver되게 해줬던 Django와 달리 flask는 직.접. 설정해주어야 한다.
set FLASK_APP
: 어떤 application을 실행할 것인지 (set FLASK_APP=pybo)set FLASK_ENV
: 실행될 flask의 운영 환경 (set FLASK_ENV=development)flask run
: flask 서버 실행!app.py
를 default 값으로 삼는다. 하지만 나의 경우 app.py 가 아닌 pybo.py라고 이름지었으므로 pybo라고 입력해 주어야 한다set FLASK_ENV
에서 developer와 development라고 했을때 차이가 있다.둘다 이전에 나왔던 환경에 대한 경고는 없졌지만 Debug mode
에서 차이가 있다. 일단 development로 진행... 기능적으로 어떤 차이가 있을지 모르겠다 당연히 debug가 지원이 안되겠지;;
5000
이다.Django는 MTV 개념이다. 이에 비행 Flask에서는 기존 생각으론 프론트에서 작업했던 CSS나 JavaScript 문서도 모두 포함하고 있다.
이에 대해 tree
구조를 살펴보면 다음과 같다.
내가 위에서 작성한 pybo.py 라는 파일이 곧 pybo 패키지에 포함되어
__init__.py
가 그 역할을 대신하는 모양이다.
Django에서는 Django의 ORM을 사용했다. Flask에ㅓㅅ는 python db 도구인 SQLAlchemy
를 사용한다!!
SQLAlchemy ?
모델 기반 db 처리. => model class들을 정의할 models.py 가 필요하다.
위에서 작성한 pybo.py에 작성된 hello_pybo
가 어디에 띄워졌는가? 바로 화면이다! 즉, 화면구성을 담당한 것.
이처럼 views directory에는 이러한 함수들로 구성된 view file들이 존재할 것이다.
기능에 따라 만들어지는 views들 예시
- main_views.py
- question_views.py
=> Django에서도 기능에 따라 views.py를 작성했던것 기억!
settings.py
or my_settings.py
격!application factory ?
app 객체를 생성하는 함수!
pybo
패키지를 생성한다.pybo.py
를 __init__.py
로 변경한다.flask run
으로 확인set FLASK_APP ??
위에서는 이 값이 실행되는 python file을 나타냈다. (pybo.py의 pybo) 하지만 지금은 실행되는모듈
을 의미함을 알 수 있다. (pybo라고 쓰여있지만 실제 가리킨건 pybo/__init__.py 을 의미)
from flask import Flask
#__init__.py 안에 바로 선언하기
'''
app = Flask(__name__)
@app.route('/')
def hello_pybo():
return 'Hello,Pybo!'
'''
# create_app 함수를 선언하여 사용하기
def create_app():
app = Flask(__name__)
@app.route('/')
def hello_pybo():
return 'Hello,Pybo!'
return app
create_app
함수가 app 객체를 생성해 반환하도록 작성되었다. app = Flask(__name__)
때문에 hello_pybo
함수를 create_app 함수 안에 포함되도록 작성하였다.
즉, 이때 사용된 create_app
이 곧 application factory 이다!
create_app ?
단어create_app
은 flask 내부에서 정의된 함수명이다! (예약어?) 따라서 이름이 변경될 경우 정상적으로 작동하지 않는다 => 잘못된 내용이다!!!!(03.24)
위에서 작성된 코드들 중 @app.route
와 같은 annotation으로 mapping 되는 함수를 라우트라고 한다.
annotation ? mapping ?
@app.route 를 통해 URL '/' 로 끝날 시 화면에 "hello, pybo"가 실행된다. 이때 '/'로 mapping 된다고 하고 mapping을 해주는@app.route('/')
를 annotation이라고 한다.
❯ ls
__pycache__ flask_pr.sh pybo
❯ mkdir views
❯ cd views
❯ ls
❯ vi main_view.py
❯ cat main_view.py
from flask import Blueprint
bp = Blueprint('main', __name__, url_prefix='/')
@bp.route('/')
def hello_pybo():
return 'Hello, Pybo!'
=> 기존에 __init__.py에 작성되어 있는 함수를 그대로 적은것. 단, annotation이 @app.route에서 @bp.route 로 변경!!
bp.route ?
여기서 bp는 Blueprint class로 생성한 객체를 의미한다.
작성된 코드 중 'main', __name__, url_prefix='/'
가 있다. Blueprint class로 객체를 생성할 때에는 이름과 모듈명, url_prefix값을 전달해야 한다.
다시 __init__.py 를 수정한다.
# application factory = create_app 사용하기
'''
def create_app():
app = Flask(__name__)
@app.route('/')
def hello_pybo():
return 'Hello,Pybo!'
return app
'''
# 위의 코드 대신 blueprint를 사용하도록 변경
# main_views.py에서 생성한 blueprint객체인 bp를 등록한다.
def create_app():
app = Flask(__name__)
from .views import main_views
app.register_blueprint(main_views.py)
from flask import Blueprint
bp = Blueprint('main', __name__, url_prefix='/')
@bp.route('/hello')
def hello_pybo():
return 'Hello, Pybo!'
@bp.route('/')
def index():
return 'Pybo index'
왜 안되지...