디지털 양피지/Flask2015. 12. 16. 14:59


1. Initialization

Flask 는 Application Instance를 반드시 생성해야 한다. python에서는 WSGI(Web Server Gateway Interface) 프로토콜을 사용하여 request를 다룬다. 

from flask import Flask

app = Flask(__name__)


2. Routes and View Functions

Flask에서는 Application Instance를 이용한 app.route 데코레이터(decorator)를 이용하여 router를 만들 수 있다.

@app.route('/')

def index():

   return '<h1>Hello World~!</h1>'

예제에서는 web server로 request가 올경우 index() 함수를 통해 response를 전달한다. 이러한 index()와 같은 함수를 View Function 이라 한다. 


라우트 데코레이터는 다음과 같은 형식으로도 사용할 수 있다.

@app.route('/user/<name>')

def user(name):

   return '<h1>Hello, %s~!</h1>' % name

이러한 dynamic components 는 route에서 기본적으로 string이며 '/user/<int:id>' 와 같은 식으로 다른 형식으로 지원 가능하다. Flask에서 지원하는 형식으로는 int, float 과 path가 있다.


3. Server Startup

app.run()을 호출 함으로 server를 시작 시킬 수 있다. debug를 True로 해 놓으면 Server 파일이 수정되면 자동으로 reload 되어 서버를 재가동 해준다. 개발할 때 사용하면 편리하게 사용할 수 있다.

if __name__ == '__main__':

   app.run(debug=True)


4. A Complete Application

아래와 같이 hello.py를 만들고 실행하면 web server 가 만들어 진다. localhost:5000 또는 127.0.0.1:5000으로 접속하면 실행 결과를 볼 수 있다.

from flask import Flask

app = Flask(__name__)


@app.route('/')

def index():

   return '<h1>Hello World~!</h1>'


@app.route('/user/<name>')

def user(name):

   return '<h1>Hello, %s </h1>' % name


if __name__ == '__main__':

   app.run(debug=True)


5. Request-Response Cycle

Flask에서 request를 어떻게 처리하여 response를 만드는지 프레임웤(framework)의 디자인 형태(design aspects)를 통하여 알아 본다.


Application and Request Contexts

Flask 는 Contexts를 사용하여 임시적으로 Request에 대한 Argument들을 가지는 global로 접근 가능하게 한다.

from Flask import request


@app.route('/')

def index():

   user_agent = request.headers.get('User-Agent')

   return '<p>Your browser is %s</p>' % user_agent


실제로 request는 global 처럼 사용하지만 global이 아니다. request는 각기 다른 요청에 따라 각각의 thread 내에서 동작하게 된다. context는 이러한 thread의 간섭없이 어떠한 변수들을 global로 접근할 수 있게 만들어 준다.


Flask에는 두개의 Context가 있으며, request가 thread에 할당 되면 활성화(active or pushes) 되어 진다.

1. Application Context

   - current_app: 현재 활성환 된 Application instance

   - g: request를 handling하기 위한 임의의 객체를 저장할 수 있는 객체. 각 request 마다 reset 되어 짐.

2. Request Context

   - request: request object. client에서 보낸 encapsulated 된 HTTP request

   - session: user session. request 동안 기억되는 dictionary 형태의 사용자 저장 공간

>> from hello import app   # hello.py를 import 한다.

>>from flask import current_app

>>app_ctx = app.app_context()

>>app_ctx.push()

>>current_app.name

>>app_ctx.pop()

위 예제에서 처러 app.app_context()를 통하여 application context를 획득하고, push()를 통항 activate 시키고 pop()을 통하여 deactivate 시킨다.


Request Dispatching

Flask에서는 request를 처리하기 위한 URL map을 app.route 데코레이터와 app.add_url_rule()을 사용하여 만들 수 있다.


Request Hooks


아래와 같은 함수들을 통하여 request마다 발생하는 database 접근이나 login 확인 등에 사용할 수 있다.


before_first_request: 첫 번째 request 올때 동작 할 수 있도록 등록된 함수.

before_request: 각 request가 처리 되기 전에 등록 된 함수.

after_request: 각 request가 처리 된 후에 등록 된 함수로 exception이 발생하면 호출 되지 않음.

teardown_request: 각 request가 처리 된 후에 등록 된 함수로 exception이 발생해도 호출 된다.


Responses

Flask에서 view function이 호출되면 request에 대한 response의 전달을 기대한다. view function의 첫 번째 return 값은 HTTP page를 나타내며 두 번째 return 값은 status code 를 return 한다. 기본 값은 200이다. 

@app.route('/')

def index():

   return '<h1>Bad Request</h1>', 400

위와 같이 400을 전달 할 수도 있다. 세번째 argument는 dictionary 형태의 header를 return 한다. 나중에 알아 보기로 한다.


Flask에서는 세개의 tuple로 return하지 않고 Response 객체를 return 할 수도 있다. make_response() 함수를 통하여 response 객체를 생성한다. 

from flask import Flask


@app.route('/')

def index():

   response = make_response('<h1>This document carries a cookie</h1>')

   response.set_cookie('answer', '42')

   return response


페이지 리다이렉션(redirection)을 위해서는 redirect 함수를 제공한다. redirect는 일반적으로 302 status code로 표시되며 reridect를 위한 URL은 Location header에 위치한다.  

from flask import Flask


@app.route('/'):

def index():

   return redirect('http://www.example.com')


또 다른 특별한 형태의 response는 abort 함수이다. 이것은 error handling을 위하여 사용된다. 하지만 abort는 다른 함수에 제어권을 넘기지 않고 web server에 exception을 발생 시킨다.

from flaks import Flask


@app.route('/user/<id>')

def get_user(id):

   user = load_user(id)

   if not user:

      abort(404)

   return '<h1>Hello, %s</h1>' % user.name


6. Flask Extensions

Flask 는 확장이 가능하도록 디자인 되어 있다. DB, authentication 등 application에 적합한 package를 선택하여 확장할 수 있다.


Command-Line Options with Flask-Script

app.runt()을 통하여 application을 실행할때 configuration option을 사용하여 실행할 수도 있지만 command-line을 통하여 설정 할 수도 있다.Flask-Script는 Flask에 command-line parser를 추가한다. 

pip install flask-script   #pip 를 이용한 flask-scrpt 설치

flask.ext space에 있으며 flask.ext.scrpt package를 사용하여 Manager 클래스를 생성하여 사용한다.

from flask import Flask

from flask.ext.script import Manager

app = Flask(__name__)

manager = Manager(app)

...

if __name__ == '__main__':

   manager.run()


위 예제를 실행하면 아래와 같은 사용 방법이 나타난다.



runserver 를 통해 실행 할 수 있으며 --help를 보면 option을 볼 수 있다. 이 옵션을 통하여 실행시 parameter를 설정할 수 있다.


runserver를 구동하면 localhost에 connection 에 응답(listen) 한다. public network interface를 위한 connection에 응답하기 위해서는 host 0.0.0.0을 사용해야 한다. 






'디지털 양피지 > Flask' 카테고리의 다른 글

Flask - Custom Filters  (0) 2016.01.05
Flask - Web Form  (0) 2015.12.18
Flask - Custom Error Pages / Links / Static Files /Time  (0) 2015.12.18
Flask - Twitter Bootstrap Integration with Flask-Bootstrap  (0) 2015.12.17
Flask - Template  (0) 2015.12.17
Posted by 빨간 양말