๐ Flask
ํ๋ผ์คํฌ๋ ๋ง์ ์ฌ๋์ด "Micro Web Framework" ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ฌ๊ธฐ์ "Micro" = "ํ๋ ์์ํฌ๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์ ์งํ๊ณ ํ์ฅํ ์ ์๋๋ก ๋ง๋ค์๋ค" ๋ผ๋ ์๋ฏธ
- Micro : ๊ฐ๋ฒผ์ด ๊ธฐ๋ฅ ์ ๊ณต, ๊ฐ๋ณ๊ฒ ๋ฐฐ์ฐ๊ณ ๊ฐ๋ณ๊ฒ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ํ์ฅ์ฑ์ด ๋๋ค.
- Framework : ์ด๋ฏธ ์์ฑ๋ ์ฝ๋์ ๋ชจ์์ธ "๋ผ์ด๋ธ๋ฌ๋ฆฌ" ๊ทธ ์ด์์ ์๋ฏธ, ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๊ธฐ ์ํ ์ผ์ ํ "๋ผ๋"๋ฅผ ์ ๊ณตํด์ฃผ๋ ๊ธฐ์
๊ฐ๋จํ ์น ์ฌ์ดํธ, ๊ฐ๋จํ API ์๋ฒ๋ฅผ ๋ง๋๋ ๋ฐ์ ํนํ ๋์ด์๋ Python Web Framework ์ด๋ค.
์์ฆ์ ํด๋ผ์ฐ๋ ์ปดํจํ
์ ๋ฐ๋ฌ๋ก Docker, Kubernetes์ ์ ๋ชฉํด์, ์๊ท๋ชจ ์ปจํ
์ด๋ ๋จ์๋ก ๊ธฐ๋ฅ ๋ณ ๊ฐ๋ฐ ํ, ํ๊บผ๋ฒ์ ๋ฐฐํฌํ๋ ๋ฐฉ์์ด๋ ๋ฐฐํฌ ํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ์์ผ๋ก ์์ฃผ ์ฌ์ฉํ๊ณ ์๋ค.
๐ก ํ๋ผ์คํฌ ์ฅ์
- ๊ฐ๋ณ๊ฒ ๋ฐฐ์ธ ์ ์๋ค : HTML/CSS/JS ์๊ณ , python์ ์ด๋์ ๋ ์๊ณ ์๋ค๋ฉด, ๋น ๋ฅด๊ฒ ๋ฐฐ์ธ ์ ์๋ค.
- ๊ฐ๋ณ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. : ์ฝ๋ ๋ช ์ค์ด๋ฉด, ๋ง๋ค ์ ์๋ค.
- ๊ฐ๋ณ๊ฒ ๋ฐฐํฌํ ์ ์๋ค. : pip์ ์ฌ์ฉํ์ฌ Flask๋ฅผ ๋ค์ด๋ฐ๊ณ ๋ฐฐํฌํ๋ฉด ๋์ด๋ค.
๐ก ํ๋ผ์คํฌ์ ๋จ์
- Django์ ๋นํด์ ์์ ๋๊ฐ ๋์ผ๋, ์ ๊ณตํด์ฃผ๋ ๊ธฐ๋ฅ์ด ๋ ํ๋ค.
- ๋ณต์กํ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๋ ค๊ณ ํ ๋, ํด์ผ ํ ๊ฒ๋ค์ด ๋ง๋ค.
Flask๋ ์๊ท๋ชจ์ ์ดํ๋ฆฌ์ผ์ด์
์ ๋น ๋ฅด๊ฒ ๋ง๋ค ์ ์๊ณ , ๋ฐฐํฌ ํ๊ฒฝ์ ๋ฐ๋ผ ๋๊ท๋ชจ ์ดํ๋ฆฌ์ผ์ด์
์ ๊ธฐ๋ฅ ํ์ฅ์ ์ญํ ์ ํ๊ธฐ ์ฌ์ด ์ฅ์ ์ด ์๋ค.
๋ฐ๋ฉด, Django๋ ๋๊ท๋ชจ ์ดํ๋ฆฌ์ผ์ด์
์ ๋น ๋ฅด๊ฒ ๋ง๋ค ์ ์์ผ๋ฉฐ, ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํด ์ฃผ๋ ๊ธฐ๋ฅ์ด ๋ง๋ค.
Flask | Django |
ORM ๊ธฐ๋ฅ์ด ์ ๊ณต๋์ง ์์ | ORM ๊ธฐ๋ฅ์ด ๋ด์ฅ |
์งง์ ์ฝ๋๋ก ์น ์๋ฒ ๊ตฌ๋๊ฐ๋ฅ | ์๋์ผ๋ก ๊ด๋ฆฌ์ ํ๋ฉด ๊ตฌ์ฑ |
ORM(Object Relational Mapping) : ORM์ DB์ OOP ์ธ์ด ๊ฐ์ ํธํ๋์ง ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ
๐ ๋ก์ปฌ์์ Simple Web Server๋์ฐ๊ธฐ : Hello World !!
ํ๊ฒฝ : VS code, Python.exe 20.3.3 version ์ด์
(์ค๋ฅ ๋ฐ์์, ๋ณดํต, ํ์ด์ฌ ์คํํ์ผ ๋ฒ์ ผ์ด, ์ด์ ๋ฒ์ ผ์ด์ด์ ๋ฐ์ํ ์ ์์ผ๋ ๊ทธ๋ด ๊ฒฝ์ฐ, ๋ฒ์ ผ ์
๊ทธ๋ ์ด๋ ํ์)
c:/python39/python.exe -m pip install --upgrade pip
c:/python39/python.exe -m pip install --upgrade pip --user (์ก์ธ์ค ๊ฑฐ๋ถ์)
์ฑ๊ณต ์, ์๋์ ๊ฐ์ "Hello world!"๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฐ๋จํ, ํ๋ผ์คํฌ ์ฝ๋ ์์ฑ
from flask import Flask # ํ๋ผ์คํฌ import
app = Flask(__name__) # app ์ด๋ผ๋ ์ด๋ฆ์, flask์ฑ์ ํ๋ ๋ง๋ค๊บผ์ผ.
@app.route('/') # ๋ผ์ฐํ
, '/'๋ ์ ์์, root ๊ฒฝ๋ก
def hello_World(): # '/'๊ณผ ๋งค์นญ๋๋ ํจ์(root ๊ฒฝ๋ก์ผ ์), ํ์ด์ง์์ ์๋ํ ๋ฉ์๋
return "Hello World!"
if __name__ == '__main__': # ๋ชจ๋ ๋ช
์ด "main"์ผ ๋๋ง ์คํํ๋๋ก ์กฐ๊ฑด๋ฌธ
app.run()
๐ Flask HTTP ํต์ : HTTP Methods
๋จผ์ HTTP ๊ฐ๋ ์ ๋ชจ๋ฅธ๋ค๋ฉด ์๋, ํฌ์คํ ์ ์ ๊น ์ฝ๊ณ ์ค์.
Flask๋ HTTP ํต์ ์ ์ํด ๋ค์๊ณผ ๊ฐ์ Methods๋ฅผ ์ ๊ณตํ๋ค.
Method | ์ค๋ช |
GET | ์ํธํ๋์ง ์์ ํํ์ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ๋ก ์ ์กํ๋๋ฐ ์ฌ์ฉ๋๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ |
HEAD | GET๊ณผ ์ ์ฌํ ๋ฐฉ๋ฒ์ผ๋ก Response Body๋ฅผ ํฌํจ์ง ์๊ณ ์ฌ์ฉ |
POST | ํน์ ์์์ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ์ฌ ์๋ฒ๋ก ์ ์กํ๋๋ฐ ์ฌ์ฉ |
PUT | ํน์ ๋์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ (Update)ํ๋๋ฐ ์ฌ์ฉ |
DELETE | URL์ ์ง์ ๋ ๋์์ ์ญ์ (DELETE)ํ๋๋ฐ ์ฌ์ฉ |
๐ URL Routing ์ด๋ ?
URL Routing : ์๋ฒ์์ ํน์ URL์ ์ ์ํ์ ์, ๋ณด์ฌ์ค ํ์ด์ง๋ฅผ ์ ํด์ฃผ๋ ๊ฒ
์ฆ, ํน์ URL์ ์ผ๋ถ ์์ ์ ์ํํ๊ธฐ ์ํ ๊ด๋ จ๋ ๊ธฐ๋ฅ๊ณผ "Mapping"ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
https://page.com/home # ํํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ณ
https://page.com/login # ๋ก๊ทธ์ธํ๋ฉด์ ๋ณด์ฌ์ค๋ค.
์์ ์์๊ฐ์ ๊ฒ์ด, URL Routing ์ด๋ค.
๐ก Flask์์ URL Mapping์ ์ด๋ป๊ฒ ํ ๊น ?
Flask์์ URL Routing์ @app.route(' ')๋ฅผ ํตํด ์ํํ๋ค.
๋ํ, ์ฌ๊ธฐ์ @๋ฅผ ํตํด ์ ์ธํ๋ ๋ฐฉ์ = ๋ฐ์ฝ๋ ์ดํฐ(decorator)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
from flask import Flask # ํ๋ผ์คํฌ import
app = Flask(__name__) # app ์ด๋ผ๋ ์ด๋ฆ์, flask์ฑ์ ํ๋ ๋ง๋ค๊บผ์ผ.
@app.route('/') # ๋ผ์ฐํ
, '/'๋ ์ ์์, root ๊ฒฝ๋ก
def home(): # '/'๊ณผ ๋งค์นญ๋๋ ํจ์(root ๊ฒฝ๋ก์ผ ์), ํ์ด์ง์์ ์๋ํ ๋ฉ์๋
return "This is Home page !!"
@app.route('/hello') # "/hello" URL ์ ์ ์
def hello():
return "Hello world !!"
if __name__ == '__main__': # ๋ชจ๋ ๋ช
์ด "main"์ผ ๋๋ง ์คํํ๋๋ก ์กฐ๊ฑด๋ฌธ
app.run()
๐ Variable Rules
ํ๋ผ์คํฌ์์๋ route( ) ๋ฅผ ์ฌ์ฉํด์ url path์ ๊ฐ์ ํ์ฉํ ์ ์๋ค.
url path์ ๋ฌธ์์ด, ์ ์, ์๋ธ๊ฒฝ๋ก๋ฅผ ํ์ฉํ ์ ์๋ค.
- ๋ฌธ์์ด์ ์ฌ์ฉํ ๋ณ์๋ช ์ <๋ณ์๋ช >์ผ๋ก ๊ฐ์ธ์ฃผ๋ฉด ํจ์์์ ์ ๋ฌ๋ฐ์ ๊ฐ์ ํ์ฉํ ์ ์๋ค.
- ์ ์๋ <int:๋ณ์๋ช > ํํ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- ์๋ธ๊ฒฝ๋ก๋ <path:subpath> ํํ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
from flask import Flask
app = Flask(__name__)
@app.route('/user/<username>')
def show_user_profile(username):
return f"User {username}"
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f"Post {post_id}"
@app.route('/path/<path:subpath>')
def show_subpath(subpath):
return f"Subpath {subpath}"
if __name__ == '__main__':
app.run()
๐ ๋ฐ์ดํฐ ๋ฐํํ๊ธฐ - jsonify( )
Flask ์์๋ ๋ฐ์ดํฐ๋ฅผ json ํ์ผ ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๋ค.
json ํ์ผ ํ์์ ์น ์ฌ์ดํธ ์์์ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ํ์์ด๋ค. Dictionaryํํ์ ์ ์ฌํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค.
Flask ์๋ ๋ฐ์ดํฐ๋ฅผ json ํ์์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ jsonify( ) ๋ฉ์๋๊ฐ ์๋ค.
from flask import Flask, jsonify # jsonify import
app = Flask(__name__)
@app.route('/')
def json():
people = [
{'name' : 'natto' , 'birth-year' : 2020},
{'name' : 'apple' , 'birth-year' : 2021},
{'name' : 'banana' , 'birth-year' : 2022}
]
return jsonify(people)
if __name__ == '__main__':
app.run()
๐ URL ์ค๊ณํ๊ธฐ - URL Building
์น ์ฌ์ดํธ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๊ณ ์ฌ์ฉ์๋ค์ด ์น ์ฌ์ดํธ์ ์ ์ํ๊ธฐ ์ํด URL ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ ํ์์ฑ์ด ์๋ค.
๋ง์ฝ ํ ํ์ด์ง์์ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ ์ ์๋๋ก "๋งํฌ"๋ฅผ ์์ฑํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น ?
Flask ์์๋ url_for( ) ๋ฉ์๋๋ฅผ ํตํด ์ด๋ฅผ ์ํํ๋ค.
url_for( ) ๋ฉ์๋ : ํน์ ํจ์์ ๋ํ url์ "๋์ "์ผ๋ก ๊ตฌ์ถํ๋ ๋ฐ ์ฌ์ฉํ๋ค.
์ผ๋ฐ์ ์ผ๋ก url ๋์ ์ ์ด๋ํ ํจ์ ์ด๋ฆ๊ณผ ์ (.)์ ์ ๋์ฌ๋ก ๋ถ์ด๋ ๊ฒ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.
from flask import Flask, redirect, url_for
app = Flask(__name__)
# ํ ํ์ด์ง๋ก ์ด๋
@app.route('/')
def home():
return "์ฃผ์์ฐฝ์ /user/admin๊ณผ /admin <br> /user/student ์ /student๋ฅผ ์
๋ ฅํด๋ณด์ธ์."
# ๊ด๋ฆฌ์ ํ์ด์ง๋ก ์ด๋
@app.route('/admin')
def admin():
return "๊ด๋ฆฌ์ ํ์ด์ง ์
๋๋ค."
@app.route('/student')
def student():
return "ํ์์ฉ ํ์ด์ง ์
๋๋ค."
# redirect() ๋ "ํ์ด์ง์ ๋ค์ ์ฐ๊ฒฐํ๋ค"๋ ๋ป์ผ๋ก ๋ง์น ํ์ด์ง๋ฅผ "์๋ก๊ณ ์นจ" ํ ๊ฒ๊ณผ ๊ฐ์ ๋์ํ๋ค.
@app.route('/user/<name>')
def user(name):
# ์ ๋ฌ ๋ฐ์ name์ด 'admin'์ด๋ผ๋ฉด ?
if name == 'admin':
return redirect(url_for('admin'))
# ์ ๋ฌ ๋ฐ์ name์ด 'student' ๋ผ๋ฉด ?
if name == 'student':
return redirect(url_for('student'))
if __name__ == '__main__':
app.run()
๋ค๋ง, ์ฐจ์ด๋ ํฐ๋ฏธ๋์์ ๋ณผ ์ ์๋ฏ์ด, "HTTP status code" ์ธ ๊ฒ ๊ฐ๋ค.
์์, HTTP ํฌ์คํ ์์ ์ค๋ช ํ๋ฏ์ด
300 = "๋ฆฌ๋ค์ด๋ ํธ" , 200 = "์ฑ๊ณต" ์ ์๋ฏธํ๋ค.
๋ ๊ฒฝ์ฐ ๋ชจ๋, GET Method๋ฅผ ์ฌ์ฉํ๊ฒ์ ๊ณตํต์ ์ด๋ค.
'python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Flask] (3) ๋ ๋๋ง ํ ํ๋ฆฟ & Jinja2 & ๊ฐ๋จํ ๊ฒ์ํ (0) | 2021.01.24 |
---|---|
[Flask] (2) REST & HTTP Method & API/End Point (0) | 2021.01.22 |
[python] ๋ฌธ์์ด ์ ๊ทํํ์ ์ ๋ฆฌ (0) | 2021.01.14 |
[python] if __name__ == '__main__' : ์ ์ ์ฒด (2) | 2021.01.09 |
[python] sort( ) ์ ๋ํด์ ์์๋ด ์๋ค. (0) | 2021.01.08 |