๋ชจ๋ ํ๋ผ์คํฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ธ์คํด์ค๋ฅผ ์์ฑํด์ผ ํ๋ค.
์น ์๋ฒ๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์์ ํ ๋ชจ๋ ๋ฆฌํ์คํธ๋ฅผ ์ด ์ค๋ธ์ ํธ์์ ์ฒ๋ฆฌํ๋๋ฐ,
์ด๋ ์น ์๋ฒ ๊ฒ์ดํธ์จ์ด ์ธํฐํ์ด์ค(WSGI)๋ผ๋ ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ค.
์ ํ๋ฆฌ์ผ์ด์
์ธ์คํด์ค๋ Flask ํด๋์ค์ ์ค๋ธ์ ํธ์ด๋ฉฐ ๋ค์๊ณผ ๊ฐ์ด ์์ฑ๋๋ค
from flask import Flask
app = Flask(__name__)
Flask ํด๋์ค ์์ฑ์์ ํ์ํ ํ ๊ฐ์ง ์ธ์๋ ๋ฉ์ธ ๋ชจ๋์ ์ด๋ฆ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํจํค์ง ์ด๋ฆ์ด๋ค. ๋๋ถ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ํ์ด์ฌ์ name ๋ณ์๊ฐ ์ ์ ํ ๊ฐ์ด๋ค.
URL๊ณผ ์ด URL์ ์ฒ๋ฆฌํ๋ ํจ์์ ๊ด๋ จ์ฑ์ route๋ผ๊ณ ํ๋ค.
ํ๋ผ์คํฌ์์ ๋ผ์ฐํธ๋ฅผ ์ ์ํ๋ ๊ฐ์ฅ ์์ฌ์ด ๋ฐฉ๋ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ธ์คํด์ค์์ app.route ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
@app.route('/user/<name>') # ๋ฐ์ฝ๋ ์ดํฐ๋ก ํจ์์ ๋์์ ๋ค๋ฅธ ํํ๋ก ์์ ํ ์ ์๋ค.
def index(name): # ์ด๋ฐ ํจ์๋ฅผ view ํจ์๋ผ๊ณ ํ๋ค.
return '<h1>Hello World, %s!</h1>' % name
@app.route('/user/<int:id>') # ์ผ์ชฝ ์ฒ๋ผ ํ์
์ง์ ๋ ๊ฐ๋ฅ, ๊ธฐ๋ณธ์ string
๊บฝ์ ('<','>')๋ฅผ ์ด์ฉํ๋ฉด ๋์ ์ผ๋ก URL์ ๋ฐ๊ณ ์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
run ๋ฉ์๋๋ ํ๋ผ์คํฌ์ ํตํฉ ๊ฐ๋ฐ ์น ์๋ฒ๋ฅผ ์คํํ๋ค
if __name__ == '__main__': # '์คํฌ๋ฆฝํธ๊ฐ ์ง์ ์คํ๋ ๋'๋ผ๋ ์๋ฏธ
app.run(debug=True) # ์คํฌ๋ฆฝํธ๊ฐ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ์ ์ํด ์ํฌํธ๋๋ฉด ๊ฑด๋ ๋ด๋ค.
์๋ฒ๊ฐ ์คํ๋๋ฉด ์๋ฒ๋ ๋ฃจํ๋ฅผ ์งํํ๋ฉฐ request๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค
์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฆฌํ์คํธ ์ปจํ ์คํธ
๋ฆฌํ์คํธ๋ฅผ ์์ ํ๋ฉด HTTP ๋ฆฌํ์คํธ๋ฅผ ์บก์ํํ์ฌ ๋ฆฌํ์คํธ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๋ค.
# ๋ทฐ ํจ์ ์ ๋ค ๋ด์ฉ์ ๋ชจ๋ ์๋ต
def index():
user_agent = request.headers.get('User-Agent')
return '<p>Your Browswer is %s</p>' % user_agent
์ฌ๊ธฐ์ request๋ ์ด๋ป๊ฒ ์ ์ญ ๋ณ์์ฒ๋ผ ์ฌ์ฉ๋ ์ ์์์๊น?
์ปจํ
์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์๋ค
ํ๋ผ์คํฌ์๋ ๋ ๊ฐ์ง ์ปจํ
์คํธ๊ฐ ์๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ
๋ฆฌํ์คํธ ์ปจํ ์คํธ
ํ๋ผ์คํฌ๋ ๋ฆฌํ์คํธ๋ฅผ ๋์คํจ์นํ๊ธฐ ์ ์ ๋ ์ปจํ ์คํธ๋ฅผ ๋ชจ๋ ํ์ฑํ(push)ํ๋ฉฐ, ๋ฆฌํ์คํธ๊ฐ ์ฒ๋ฆฌ๋ ๋ ๊ทธ๊ฒ๋ค์ ์ญ์ ํ๋ค.
from hello import app # ๋ค๋ฅธ ํ์ผ์ app์ ๊ฐ์ ธ์จ๋ค
from flask import current_app # ์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ ์ค ํ๋
current_app.name # ์๋ฌ ๋ฐ์
app_ctx = app.app_context()
app_ctx.push() # ํ์ฑํ
current_app.name # 'hello'
app_ctx.pop() # ๋นํ์ฑํ
๋ฆฌํ์คํธ ๋์คํจ์น
url_map์ ์ฌ์ฉํ๋ฉด URL ๋งต์ด ์ด๋ป๊ฒ ๋์ด ์๋์ง ํ์ธํ ์ ์๋ค.
app.url_map
Map([<Rule '/' (HEAD, OPTIONS, GET -> index>,
<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static,
<Rule '/user/<name>' (HEAD, OPTIONS, GET) -> user])
๋ฆฌํ์คํธ ํํฌ
๋๋๋ก ๊ฐ๊ฐ์ ๋ฆฌํ์คํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ ํ์ ์ฝ๋๋ฅผ ์คํํ๋ ๊ฒ์ ์ ์ฉํ๋ค.
์ด๋ฅผ ์ํด ๋ฆฌํ์คํธ ํํฌ๋ฅผ ๋ฐ์ฝ๋ ์ดํฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
๋ฆฌํ์คํธ ํํฌ ํจ์์ ๋ทฐ ํจ์ ์ฌ์ด์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๊ธฐ ์ํ ๊ณตํต ํจํด์ g ์ปจํ ์คํธ ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
์๋ต
๋ทฐ ํจ์๊ฐ ๋ค๋ฅธ ์ํ ์ฝ๋๋ฅผ ์๋ต์ผ๋ก ๋ณด๋ด๊ณ ์ ํ ๋๋, ์๋ต ํ ์คํธ ์ดํ์ ๋๋ฒ ์งธ ๋ฆฌํด๊ฐ์ผ๋ก ๋ด๋ฉ๋ฆฐ(numeric) ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผํ๋ค.
# ๋ทฐ ์ด์ ์ฝ๋๋ ์๋ต
def index():
return '<h1>'hello'</h1>', 400 # ์๋ต์ฝ๋๋ก 400์ ๋ณด๋ธ๋ค
์ธ๋ฒ ์งธ ์ธ์๋ฅผ ๋ถ์ด๋ฉด ์ด๋ ์๋ต ํค๋์ ๋์
๋๋ฆฌ์ ํด๋นํ๋ค.
์๋ต์ Response ์ค๋ธ์ ํธ๋ก ํ ์๋ ์๋ค.
from flask import make_response
@app.route('/')
def index():
response = make_response('<h1>response with cookie</h1>')
response.set_cookie('answer', '42')
return response
๊ทธ๋ฌ๋ฉด ์ด๋ ๊ฒ ์๋ต์ ์ฟ ํค๋ฅผ ๋ถ์ผ ์ ์๋ค.
๋ฆฌ๋ค์ด๋ ํธ ์๋ต์ ์์ ๋ ์๋์ ๊ฐ๋ค
from flask import redirect
@app.route('/')
def index():
return redirect('http://www.example.com')
ํน๋ณํ ์๋ต์ผ๋ก๋ abort ํจ์๊ฐ ์๋ค.
์ด ํจ์๋ ์๋ฌ๋ฅผ ํธ๋ค๋ง ํ๊ธฐ ์ํ ํจ์์ด๋ค.
from flask import abort
@app.route('/user/<id>')
def get_user(id):
user = load_user(id)
if not user:
abort(404)
return '<h1>Error, %s</h1>' % user.name
pip install flask-script
ํ๋ผ์คํฌ์ ๊ฐ๋ฐ ์น ์๋ฒ์ ์ค์ ์ต์
์ ๋๊ฒจ์ฃผ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ app.run()์ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ๋ ์ด์์ ์ธ ๋ฐฉ๋ฒ์ ์ปค๋ฉ๋ ๋ผ์ธ ์ธ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
์ฌ์ฉ ์์ ๋ ์๋์ ๊ฐ๋ค.
from flask.ext.script import Manager # Manager๋ฅผ ์จ๋ณด๊ฒ ๋ค.
manager = Manager(app)
# ...
if __name__ == '__main__':
manager.run()
flask.ext ๋ค์์คํ์ด์ค๋ก extension์ ๊ฐ์ ธ์ค๊ณ
๋ฉ๋ ํด๋์ค์ ์ธ์คํด์ค๋ ์ ํ๋ฆฌ์ผ์ด์
์ธ์คํด์ค(app)๋ฅผ ์์ฑ์(Manager)์ ์ธ์๋ก ๋๊น์ผ๋ก์จ ์ด๊ธฐํ๋๋ค.
์๋ฒ ์คํํธ์
์ manager.run()์ผ๋ก ๋ผ์ฐํธ๋๋ฉฐ ์ปค๋งจ๋ ๋ผ์ธ์ ํ์ฑ๋จ.