Flask

이승수·2021년 10월 14일
0
  • 파이썬을 사용해 웹 어플리케이션을 작성할 수 있도록 도와주는 역할
  • 마이크로 웹 프레임워크 : 웹 어플리케이션을 개발할 수 있도록 웹 서비스 (Web Service) 나 웹 API (Web API) 등을 제공하고 웹 개발과 배포를 할 수 있는 특정 방법을 제공합니다. 쉽게 말해 뭔가를 만들어낼 수 있는 도구 모음을 제공 / 마이크로가 붙었으니 최소한의 도구들을 모아놓은 것

폴더 생성

# 이런 구조가 되도록 flask_app이란 파일을 만들고 
# 그 안에 __init__.py 파일을 만든다
flask_app
└── __init__.py

Flask 어플리케이션 생성하기

# __init__.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello World!'
    
# 해당 주소에 'Hello World!'가 뜨게 됨

작성 후 CLI에서
$ FLASK_APP=flask_app flask run로 실행
($ FLASK_APP=파일이름 flask run)
Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
→ 이 어플리케이션에 접속할 수 있는 주소

@app.route('/')
어플리케이션의 루트 주소 ('/') 에 접속했을 때에 실행하라는 뜻
괄호 안에 있는 것이 엔드포인트 127.0.0.1:5000 + /

HTTP Request 메소드

기본적으로 Flask 의 라우트 데코레이터를 사용하게 되면 GET, HEAD, OPTIONS 메소드를 허용한다
POST, PUT, PATCH, DELETE 등 다른 메소드들을 통과하도록 설정하려면 methods=[ ]를 사용한다

# 메소드 추가하기
@app.route('/', methods=['POST', 'GET'])
def index():
    ...

※ GET 과 POST 라는 메소드가 통과되고 HEAD 와 OPTIONS 라는 메소드들은 이제 사용이 불가능하다

세부 엔드포인트

route를 설정할 때 엔드포인트에 꺽쇠 (< >) 모양으로 어떠한 변수를 받겠다고 설정할 수 있다

@app.route('/index/<num>')
def index_number(num):
    return 'Welcome %i' % int(num)
    
→ http://127.0.0.1:5000/index/5 에 접하게 되면 Welcome 5 출력

※ 기본적으로 URL 을 통해 들어오게 되는 값은 문자열 타입이어서 숫자로 변형해줘야 한다
처음부터 받을 때에 타입을 지정할 때에는 이렇게 표기한다 @app.route('/index/<int:num>')

# 숫자가 안 주어지면 0 을 기본으로 설정해주는 방법
@app.route('/index/', defaults={ 'num' : 0 })
@app.route('/index/<num>')
def index_number(num):
    return 'Welcome %i' % int(num)

블루프린트 사용하기

  • 라우트들을 하나의 파일로 모아서 사용하지 않고 기능별로 나눠서 블루프린트 기능을 사용한다
  • 블루프린트는 Flask 에서 여러 개의 라우트를 한 곳에 묶어둘 수 있는 기능이 있다

파일의 구조

# routes 라는 폴더를 만들어 그 안에 user_routes.py 라는 파이썬 파일을 생성

flask_app
├── __init__.py
└── routes
    └── user_routes.py

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 파일에서 해당 파일을 불러와서 사용할 수 있다

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

  • 파이썬에서 circular import 를 피하기 위해서 Flask 에서는 어플리케이션 팩토리 패턴을 추천하고 있다
  • 여러 개의 어플리케이션을 동시에 사용하거나 app 이 선언되어 있는 파일의 일부분만 필요할 때에도 문제가 발생할 수가 있기 때문에 함수를 따로 만든다

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()
  • 함수 안에다가 어플리케이션을 생성해 준다면 해당 함수를 실행하기만 하면 원하는 어플리케이션이 하나 만들어진다
  • 이제는 다른 파일에서 import 를 해도 문제가 될 일도 줄어든다
  • 블루프린트도 함수 내에서 import 를 해온 뒤에 어플리케이션에 추가해준다

Flask 의 HTML 렌더링

  • render_template 이라는 메소드로 html 파일들을 불러올 수 있는 방법
  • 해당 함수는 기본적으로 프로젝트 폴더 내에 'templates' 라는 이름의 폴더를 기본 경로로 설정한다
  • templates 폴더를 만들고 내부에 html 파일들을 모아두면 손쉽게 사용할 수가 있다
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
  return render_template('index.html')
profile
AI/Data Science

0개의 댓글