[Flask] 1. Flask 란?

채록·2021년 3월 14일
3

Flask

목록 보기
1/3
post-thumbnail

오늘부터 Flask 시작!

참고 자료


0. Framework vs Library

Flask는 python 기반의 framework이다. framework와 library의 개념이 헷갈릴 수 있는데 물론 공통점도 있지만 엄연히 다른 개념이다.

Framework && Library

  • 필요한 기능을 재사용 가능하도록 구현해 놓았다

Framework | Library

  • Framework는 framework가 개발자의 코드를 실행하는 개념
  • Library는 개발자의 코드 안에서 실행되는 개념

------------------------------


I. Flask start

1. 가상환경 준비 / dir 생성

하나의 프로젝트당 하나의 가상환경 어떻게 보면 같은 환경일 프로젝트이지만 굳이 하나를 더 만들어 주는격일수도 있다. 그치만 어떤 프로젝트에 어떤 가상환경인지 모두 기억하기가.. 어려우므로 나의 경우 해당 프로젝트 이름으로 가상환경을 만들어 준다. (이후 연습용 프로젝트였을 경우 삭제해주면 되지!)

바로 pip install flask 해주기.


2. python file 생성 (pybo.py)

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 이다.

3. flask run

1) run 명령어 실행

기존에 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 서버 실행!

추가 사항

  • 기본적으로 FLASK_APP은 아무런 값이 없을 시 app.py를 default 값으로 삼는다. 하지만 나의 경우 app.py 가 아닌 pybo.py라고 이름지었으므로 pybo라고 입력해 주어야 한다

의문점

  • set FLASK_ENV 에서 developerdevelopment라고 했을때 차이가 있다.

둘다 이전에 나왔던 환경에 대한 경고는 없졌지만 Debug mode에서 차이가 있다. 일단 development로 진행... 기능적으로 어떤 차이가 있을지 모르겠다 당연히 debug가 지원이 안되겠지;;


2) run 확인

flask의 기본 port는 5000이다.


4. Flask 구조 구성하기

Django는 MTV 개념이다. 이에 비행 Flask에서는 기존 생각으론 프론트에서 작업했던 CSS나 JavaScript 문서도 모두 포함하고 있다.

이에 대해 tree구조를 살펴보면 다음과 같다.

내가 위에서 작성한 pybo.py 라는 파일이 곧 pybo 패키지에 포함되어 __init__.py가 그 역할을 대신하는 모양이다.


1) DB처리 => models.py

Django에서는 Django의 ORM을 사용했다. Flask에ㅓㅅ는 python db 도구인 SQLAlchemy를 사용한다!!

SQLAlchemy ?
모델 기반 db 처리. => model class들을 정의할 models.py 가 필요하다.

2) server로 전송되는 form 처리 => forms.py

3) 화면을 구성하는 veiws directory

위에서 작성한 pybo.py에 작성된 hello_pybo가 어디에 띄워졌는가? 바로 화면이다! 즉, 화면구성을 담당한 것.
이처럼 views directory에는 이러한 함수들로 구성된 view file들이 존재할 것이다.

기능에 따라 만들어지는 views들 예시

  • main_views.py
  • question_views.py
    => Django에서도 기능에 따라 views.py를 작성했던것 기억!

4) CSS, JS, image 저장 => static directory

5) html 저장 => templates directory

6) 파이보 PJ 설정 => config.py

  • 파이보 프로젝트의 환경변수
  • 데이터베이스 설정
    등... 거의 Django의 settings.py or my_settings.py 격!

------------------------------


II. Application facotry

1. What ?

application factory ?
app 객체를 생성하는 함수!

이론+실습

  • flask_pr directory에 pybo 패키지를 생성한다.
  • 이전에 작성한 flask_pr directory의 pybo.py__init__.py로 변경한다.
  • flask run 으로 확인

set FLASK_APP ??
위에서는 이 값이 실행되는 python file을 나타냈다. (pybo.py의 pybo) 하지만 지금은 실행되는 모듈을 의미함을 알 수 있다. (pybo라고 쓰여있지만 실제 가리킨건 pybo/__init__.py 을 의미)


2 Use ! create_app

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_appflask 내부에서 정의된 함수명이다! (예약어?) 따라서 이름이 변경될 경우 정상적으로 작동하지 않는다 => 잘못된 내용이다!!!!(03.24)


3. Route

위에서 작성된 코드들 중 @app.route와 같은 annotation으로 mapping 되는 함수를 라우트라고 한다.

annotation ? mapping ?
@app.route 를 통해 URL '/' 로 끝날 시 화면에 "hello, pybo"가 실행된다. 이때 '/'로 mapping 된다고 하고 mapping을 해주는 @app.route('/')를 annotation이라고 한다.


4. Blue print

  • '청사진' / route 함수를 구조적으로 관리할 수 있다.
    => flask에서는 URL과 호출되는 함수의 관계를 확인할수 있다는Blueprint class를 의미한다.

1. 생성

❯ 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값을 전달해야 한다.

2. blueprint 적용 - __init.py__ 설정

다시 __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)

3. blueprint 적용 - URL 설정

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'

4. route 함수 동작 확인하기

왜 안되지...

profile
🍎 🍊 🍋 🍏 🍇

0개의 댓글