2 분 소요

Flaks란?

  • __init__.py란?

    디텍터리가 패키지로 인식되도록 하는 역할도 하고, 이름 그대로 패키지를 초기화하는 역할을 한다. import로 패키지를 가져오면 init.py 파일이 실행된다. 이때 모듈 형식으로 현재 패키지에서 모듈을 가져오게 된다.

    (PEP420) python3.3 부터는 없어도 패키지로 인식한다. 하지만 하위 버전 호환성을 위해서 만들어주는 것이 안전하다.

Micro Web Framework

웹 사이트 혹은 간단한 API 서버를 만드는 데에 특화되어 있는 Python Web Framework

Micro가 붙는 이유 : 만들 수 있는 도구 모음들이 최소한의 크기로 줄어진 것이기 때문이다.

Flask 패키지나 라이브러리 : Jinja, Werkzeug, Flask-SQLAlchemy

Flask 시작하기

  • 현재 파일 위치
    • flask_app

      init.py

$ pip install flask

#__init__.py 이라는 파일을 만든 이후에 사용해야 한다.

from flask import Flask

app = Flask(__name__)
  • __name__이란?

    해당 파이썬 파일의 이름

    모듈의 이름으로 a.py이면 a가 __name__이 된다.

$ FLASK_APP=flask_app flask run : CLI로 실행 (이때 폴더명은 flaks_app)

127.0.0.1은 localhost이고 5000은 port이다.

위의 주소로 접속하면 Not Fount 404 에러를 만날 것이다.

라우트 추가하기

@app.route('/')
def index():
    return 'Hello World!'

# 어플리케이션의 루트 주소 (‘/’)에 접속했을 때 실행하라 = 엔드포인트 설정

# 엔드포인트에 /를 설정했기때문에 URL은 127.0.0.1:5000 -> 127.0.0.1:5000/ 이 된다.

# 만약 엔드포인트를 /about으로 설정하면 URL은 127.0.0.1:5000/about이 된다.

라우트 기능

  • 라우트란?

    route, 길이라는 뜻이다.

  • HTTP Request 메소드

      @app.route('/', methods=['POST', 'GET'])
      def index():
    

    라우트 데코레이터를 사용하게 되면 3가지 HTTP Request 메소드를 사용할 수 있다.

    • GET, HEAD, OPTION
  • 세부 엔드포인트

      @app.route('/index/<num>')
      def index_number(num):
          return 'Welcome to Index %i' % int(num)
    

    라우트 설정 시 엔드포인테으 <> 모양으로 어떠한 변수를 받겠다고 설정할 수 있다.

    이 <> 안에 변수의 이름을 지정해주고 함수에서는 변수를 받아 사용할 수 있다.

      @app.route('/index/', defaults={ 'num' : 0 })
      @app.route('/index/<num>')
      def index_number(num):
          return 'Welcome to Index %i' % int(num)
    

    위와 같이 라우트 데코를 하나 더 추가해서 defaults에 num = 0이라고 설정해주면 숫자를 주지않아도 자동으로 접속이 된다.

블루프린트

  • 현재 파일 위치
    • 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'

Blueprint() 안에 들어가는 인수

  • ‘user’ : 블루프린트의 명칭
  • name : 블루프린트의 import 이름
  • url_prefix=’/user’ : URL 접두어 설정

    (해당 블루프린트의 라우트는 URL 앞에 ‘/user’ 가 자동으로 붙게 된다.)

# __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!'

Application Factory

from flask import Flask

def create_app(): # 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()

Jinja

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return '''
     <html>
      <head>
        <title>
          HTML Page
        </title>
      </head>
      <body>
        <h1>Writing HTML...</h1>
      </body>
     </html>
     '''

Flask에서 Jinja로 변수 넘기기

@app.route('/')
def index():
    apple = 'red'
    apple_count = 10
    return render_template('index.html', fruit_color=apple, number=apple_count)

FLASK 환경변수로 설정하기

export FLASK_APP=flask_app : 환경변수로 Flask 넘겨주기

python -m flask run : python으로 flask 실행

export FLASK_ENV=development : 실시간으로 바꾸게 해주는 명령어