๋ชฉ์ฐจ
- Flask
ํ์ด์ฌ์ ์์ฒด์ ์ผ๋ก ๋ด์ฅ ์น์๋ฒ ๋ชจ๋์ ๊ฐ์ง๊ณ ์๋ค. ์น ํ๋ก๊ทธ๋จ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ CGI ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ WSGI(Web Server Gateway Interface)๊ธฐ๋ฐ์ผ๋ก ์์ฑํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ์ด ๋ฐฉ๋ฒ์ผ๋ก ์น ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ง๋ ์๋๋ค. ์๋ํ๋ฉด ํ์ด์ ์ ์์ฒด์ ์ผ๋ก ์น์๋ฒ๋ฅผ ๊ตฌ์ถํ ๋ ์์ฃผ ์ข์ ๊ฒฝ๋ ์น ํ๋ ์์ํฌ์ธ Flask๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ํ์ ์ธ ์น ํ๋ ์์ํฌ๋ก ์ฅ๊ณ (Django)์ ํ๋ฆฌ์คํฌ(Flask)๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค๊ณ ํ๋ค. ๋ ์ค์ ํ๋ผ์คํฌ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋๋ฌธ์ผ ๊ฒ์ด๋ค.
์ฅ๊ณ ๋ ํ์คํ ํ๋ ์์ํฌ์ฌ์, ์น ํ๋ก๊ทธ๋๋ฐ์ ํ ๋ ํ์๋ก ํ๋ ๋ชจ๋ ๊ฒ๋ค์ด ์ข ํฉ์ ์ผ๋ก ๊ฐ์ถ์ด์ง ํ๋ ์์ํฌ์ด๋ค.
๋๋ฌธ์ ์ธ์ฆ๊ณผ ๊ถํ, ORM, ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๋ก๊ทธ์ฒ๋ฆฌ, ๋ณด์, ๊ด๋ฆฌ์ ๊ธฐ๋ฅ ๋ฑ์ ๋ค์ํ ์์๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต์ด ๋๋ค.
๋ฐ๋ฉด ํ๋ผ์คํฌ๋ ๊ฒฝ๋ ์น ํ๋ ์์ํฌ๋ก์ WSGI์ฝ์ด์ URL ๋ผ์ฐํ ์ ์ง์ํ๊ธฐ ์ํด werkzeug(๋ฐฑ์์ด๊ทธ)์ ํ ํ๋ฆฟ ์ถ๋ ฅ์ ์ํด jinja2 ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํจ๊ป ๋ฐฐํฌํ๋ค.
๊ผญ ํ์ํ ํต์ฌ ์์๋ฅผ ์ ์ธํ๊ณ ๋ ํ์ํ ๋ ๋ง๋ค ์ง์ ํ๊ฒฝ์ ๋ง์ถฐ ๊ฐ๋ฐ์ ํ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐพ์์ ์ถ๊ฐํด์ผ ํ๋ค. ์ด ๋ง์ ๊ทธ๋งํผ ๊ฐ๋ณ๋ค๋ ๊ฒ์ด๊ณ , iot ์ฌ๋ฌผ์ธํฐ๋ท ํ๋ก์ ํธ์์ ๋จ์ํ ๋ฐ์ดํฐ ์ ์ก ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด์๋ ๋ฌด๊ฑฐ์ด ์ฅ๊ณ ๋ฅผ ์ธ ํ์๊ฐ ์๋ค.
๊ฐ๋จํ ์ฝ๋ ๋ฆฌ๋ทฐ
# flask ํด๋์์ Flask ํด๋์คํธ, ๋๋ ํจ์, ๋๋ ๋ณ์๋ฅผ ๊ฐ์ ธ์จ๋ค. ๋ณดํต ๋๋ฌธ์๋ ํด๋์ค
from flask import Flask
๋ผ์ด๋ธ๋ฌ๋ฆฌ path๊ฐ ์ ์ฉ๋ ๊ธฐ๋ณธ ํด๋์์ flask ํด๋๋ฅผ ์ฐพ๊ณ , ๊ทธ ํด๋ ์์ ์๋ Flaskํด๋์ค๋ฅผ importํ๋ค
app = Flask(__name__)
flask ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ฝ๋๋ก์,
flask ๊ฐ์ฒด๋ ์น ๋ธ๋ผ์ฐ์ ๋ก ์ค๋ ๋ชจ๋ ์์ฒญ๊ณผ ํ ํ๋ฆฟ๊ณผ์ ์ฐ๊ณ์ ๊ฐ์ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ๋ํด ์ํฅ์ ๋ฏธ์น๋ ๋ฉ์ธ ๊ฐ์ฒด์ด๋ค
Flask ํด๋์ค๋ ์์ฑ์ ์ธ์๋ฅผ ํ๋ ๋ฐ๊ฒ ๋๋๋ฐ, __name__์ด๋ค.
๋ด ํ์ผ๋ช , ์ฆ ๋ชจ๋๋ช ์ ๋ปํ๋ค. ํ์ผ์ ์์ฑํ ๋ ํ์ผ๋ช ์ test_flask๋ก ํ์์ผ๋, __name__์ test_flask.py ์ด๋ค.
@app.route("/")
๋ผ์ฐํ ์ ์ํ ๋ทฐ ํจ์๋ฅผ ๋ฑ๋กํ๋ ์ฝ๋์ด๋ค
ํด๋ผ์ด์ธํธ๊ฐ URI๋ก "/" ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ฉด, ์ฆ ๊ทธ๋ฅ ์ฌ์ดํธ ๋ฉ์ธ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค. ์ด๋ ์์ฒญ์ ํ๋ฉด, ํด๋น route ๋ฐ์ฝ๋ ์ดํฐ ์๋์ ์๋ ๋ทฐ ํจ์๊ฐ ์๋ ํธ์ถ ๋๋ค. ๋๋ ์ฒ์์ ๋ผ์ฐํ ์ ์ํ ๋ทฐ ํจ์ ๋ฐ์ ์ ํจ์ ์ฝ๋๋ฅผ ๋์๋๋ฐ, ํด๋น ํจ์๊ฐ ์คํ์ด ๋๋์ง ์์ํ๋๋ฐ, ์๋ ํธ์ถ ๋๋ ์ฑ์ง๋๋ฌธ์ ๊ทธ๋ฐ๊ฑฐ์๋ค.
์๋ฅผ ๋ค์ด, "/" ์ด๋ ๊ฒ ๋์ด ์์ผ๋ http://localhost:5000/์ผ๋ก ์์ฒญํ๊ฒ ๋๋ฉด, ํด๋น route๊ฐ ํธ์ถ๋๋ค.
def hi():
return "hi, this webpage is for you"
"hi, this webpage is for you" ๋ ํจ์๊ฐ ์ข ๋ฃ๋ ๋ ์์ฒญํ์ชฝ์ผ๋ก ์๋ต๋๋ String ๊ฐ์ด๋ค.
route ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํตํด์ ๋ทฐ ํจ์๊ฐ ํธ์ถ๋ ๊ฒฝ์ฐ ํจ์๋ช hi๋ ๋ง์๋๋ก ์ ํด๋ ๋๋ค. ๋จ ์ฌ๊ธฐ์ return ๋ฌธ์ ํด๋ผ์ด์ธํธ๊ฐ ์ฃผ์์์ฒญ์ ํ๊ฒ ๋๋ฉด ๋ทฐ ํจ์๊ฐ ํธ์ถ๋๊ฒ ๋๋๋ฐ ์ด๋ ๋ทฐ ํจ์์๋ ํ์์ ์ผ๋ก return ๋ฌธ์ด ์์ด์ผ ํ๋ค.
์ฌ๊ธฐ์ json์ ๋ฆฌํด ํ ์๋ ์๊ณ , dict ์๋ฃํ์ ๋ฆฌํด ํ ์๋ ์๊ณ ํ์์ ๋ฐ๋ผ html ํ์ด์ง๋ก ๋ทฐ๋ ๋๋ง์ ํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
if __name__ = "__main__":
app.run(host="127.4.1.34")
์ฌ๊ธฐ์ ip๊ฐ์ ๊ฒฝ์ฐ ํฐ๋ฏธ๋์์ ipconfig ๊ฐ์๊ฑฐ๋ก ๋ณธ์ธ ip๋ฅผ ์ฐพ์์ ์ ๋ ฅํ๋ค์์, ์ค์ ํธ๋ํฐ์ผ๋ก ๊ฐ์ ์์ดํ์ด์ ์ฐ๊ฒฐํด๋ ์ํ์ด๋ฉด, ํด๋น url์ ์ ๊ทผํ๋ ๊ฒ๋ง์ผ๋ก๋ ์๊ฒฉ์ผ๋ก ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์ ๋ช ๋ น์ ๋ด๋ฆด ์ ์๋ค.
__name__ ์ ๋ ๊ฐ์ง ์ด๋ฆ์ ๊ฐ์ง๋ค. ์ฒซ ๋ฒ์งธ๋ ๋ด ๋ชจ๋๋ช ์ธ test_flask.py ์ด๋ค. ๋ ๋ฒ์งธ ์ด๋ฆ์ ์กฐ๊ธ ํน์ดํ๋ค. test_flask.py ํ์ผ์ ์ง์ ํฐ๋ฏธ๋์์ ์คํํ๊ฒ ๋๋ฉด __main__ ์ด๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง๊ฒ ๋๋ค.
๋ง์ฝ์ ๋ค๋ฅธ ํ์ผ์์ test_flask.py ํ์ผ์ import ํด์ ์ฌ์ฉํ๊ฒ ๋๋ฉด, __name__ ์ด __main__์ด๋ผ๋ ์ด๋ฆ์ด ๋ ์ ์๊ณ __name__ ์ด __main__์ด ๋๋ ค๋ฉด import ๊ฐ ์๋ ํด๋น ํ์ผ์ ์ง์ ์คํ ์ํค๋ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅํ๋ค(์ค์)
์ ๋ฌธ์ฅ์ด ํ์ํ ์ด์ ๋ test_flask.py ํ์ผ์ ์ง์ ์คํ์์ผฐ์ ๋๋ง "์๋ฒ๋ฅผ ์๋์์ผ" ๋ผ๋ ๋ป์ด๋ค.
from flask import Flask
import RPi.GPIO as gpio
app = Flask(__name__)
chLED = 17
gpio.warnings(False)
gpio.setmode(gpio.bcm)
gpio.setup(chLED, gpio.out, initial=gpio.LOW)
@app.route("/")
def hi():
return "hi, this web is for you"
@app.route("/led/on")
def ledOn():
gpio.output(chLED, gpio.HIGH)
return "LED ON"
@app.route("/led/off")
def ledOff():
gpio.output(chLED, gpio.LOW)
return "LED OFF"
if __name__ == "__main__":
app.run(host="127.4.1.13")