์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Absolute
- AGI
- ai
- AI agents
- AI engineer
- AI researcher
- ajax
- algorithm
- Algorithms
- aliases
- Array ๊ฐ์ฒด
- ASI
- bayes' theorem
- Bit
- Blur
- BOM
- bootstrap
- canva
- challenges
- ChatGPT
- Today
- In Total
A Joyful AI Research Journey๐ณ๐
[48] 230308 Ch. 6 Flask๋ฅผ ํ์ฉํ ์ผ์ ์ ์ด: 5. Flask ์นํ์ด์ง, 6. IP, Port, Process ๊ฐ๋ ์ก๊ธฐ, 7. cron๊ณผ daemon ๊ฐ๋ ์ก๊ธฐ [K-๋์งํธ ํธ๋ ์ด๋ 48์ผ] ๋ณธ๋ฌธ
[48] 230308 Ch. 6 Flask๋ฅผ ํ์ฉํ ์ผ์ ์ ์ด: 5. Flask ์นํ์ด์ง, 6. IP, Port, Process ๊ฐ๋ ์ก๊ธฐ, 7. cron๊ณผ daemon ๊ฐ๋ ์ก๊ธฐ [K-๋์งํธ ํธ๋ ์ด๋ 48์ผ]
yjyuwisely 2023. 3. 8. 09:11230308 Wed 48th class
Ch. 6 Flask๋ฅผ ํ์ฉํ ์ผ์ ์ ์ด
์ง๋: p. 156 ~ (๊ต์ฌ: IoT ์ฌ๋ฌผ์ธํฐ๋ท์ ์ํ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด 4 ์ ์, ์ ์: ์ต์ฃผํธ , ๊น์ฌ๋ฒ , ์ ๋์ง)
๊ต์ฌ ์ฝ๋ ๊นํ๋ธ: https://github.com/codingspecialist/RaspberryPi4-Book-Example
๊ต์ฌ ์์ค ๋ฐ PPT: http://jspstudy.co.kr/main/main.jsp
์ ์ ์นดํ: https://cafe.naver.com/metacoding
์ค๋ ๋ฐฐ์ด ๊ฒ ์ค ๊ธฐ์ตํ ๊ฒ์ ์ ๋ฆฌํ๋ค.
๋ชฐ๋๋ ๊ฒ
Rendering is a process used in web development that turns website code into the interactive pages users see when they visit a website. The term generally refers to the use of HTML, CSS, and JavaScript codes. The process is completed by a rendering engine, the software used by a web browser to render a web page. Because of its close association with web browsers, rendering engines are commonly referred to as browser engines.
์ฐธ๊ณ : https://www.seobility.net/en/wiki/Rendering
๋ ๋๋ง์ด๋ ์๋ฒ๋ก๋ถํฐ HTML ํ์ผ์ ๋ฐ์ ๋ธ๋ผ์ฐ์ ์ ๋ฟ๋ ค์ฃผ๋ ๊ณผ์ ์ด๋ค. ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ๋ก๋ถํฐ HTML ๋ฌธ์๋ฅผ ๋ค์ด ๋ฐ๋๋ค.
์ฐธ๊ณ
Rendering is the process that turns the code you write an application in into something that users can interact with on a web page.
Visual Studio Code์์ Flask ์ค์น ๋ฐฉ๋ฒ ๋งํฌ๋ค
https://velog.io/@awesome-hong/VScode์์-๊ฐ์ํ๊ฒฝ-์ค์ -Flask-์ค์นํ๊ธฐ
https://flask.palletsprojects.com/en/1.1.x/installation/#python-version
ํ๋ผ์คํฌ ํํ ๋ฆฌ์ผ
https://realpython.com/flask-blueprint/
Ch. 6 Flask๋ฅผ ํ์ฉํ ์ผ์ ์ ์ด
01 _ Flask ์ธํ ํ๊ธฐ
01-1 ๋ผ์ฆ๋ฒ ๋ฆฌ 4์์ ์ค์นํ๊ธฐ
01-2 Flask ์ค์นํ๊ธฐ
02 _ Flask ์น์๋ฒ ๊ตฌ์ถํ๊ธฐ
03 _ Flask ๋ผ์ฐํ
04 _ Flask LED ์ ์ดํ๊ธฐ
04-1 Flask LED ์ ์ด ์ ์ ๋ผ์ฐํ
04-2 Flask LED ์ ์ด ๋์ ๋ผ์ฐํ ใ์ฐํ๊ดํธใ
04-3 Flask LED ์ ์ด ๋์ ๋ผ์ฐํ ใ์ฟผ๋ฆฌ์คํธ๋งใ
05 _ Flask ์นํ์ด์ง
05-1 Flask, HTML, CSS, Javascript๋ฅผ ์ด์ฉํ ์นํ์ด์ง ๋ง๋ค๊ธฐ
05-2 fetch() ํจ์ ์ดํดํ๊ธฐ
05-3 ํ์ดํ ํจ์ ์ดํดํ๊ธฐ
06 _ IP, Port, Process ๊ฐ๋ ์ก๊ธฐ
06-1 IP ๊ฐ๋ ์ก๊ธฐ
06-2 Port ๊ฐ๋ ์ก๊ธฐ
06-3 Process ๊ฐ๋ ์ก๊ธฐ
07 _ cron๊ณผ daemon ๊ฐ๋ ์ก๊ธฐ
07-1 cron(ํฌ๋ก ) ๊ฐ๋ ์ก๊ธฐ
07-2 daemon(๋ฐ๋ชฌ) ๊ฐ๋ ์ก๊ธฐ
08 _ ๊ณต๊ณต๋ฐ์ดํฐ ํ์ฉํ๊ธฐ
08-1 ๊ณต๊ณต๋ฐ์ดํฐ ์ ์ฒญํ๊ธฐ
08-2 ๊ณต๊ณต๋ฐ์ดํฐ ๋ถ์ํ๊ธฐ
08-3 ํ์ด์ฌ์ ํ์ฉํ์ฌ ์จ์ต๋ ํ์ธํ๊ธฐ
ํ์ต๋ชฉํ
ํ์ต๋ด์ฉ
5 Flask ์นํ์ด์ง
http://localhost:5000/led?state=on
http://localhost:5000/led?state=off
<a href="led?state=on">LED ON</a>
<a href="led?state=off">LED OFF</a>
<button onclick = "led_on()">LED ON</button>
5.1 Flask, HTML, CSS, Javascript๋ฅผ ์ด์ฉํ ์นํ์ด์ง ๋ง๋ค๊ธฐ
๊ธฐ๋ณธ ํด๋ ๊ตฌ์ฑ
webapps
- ch06
- home
- static #์ด๋ฆ ๋ฐ๊ฟ๋ ๋จ
- templates
home ํด๋: ์ต์์ root ํด๋
static ํด๋: flask์์๋ ํด๋น ํด๋๋ฅผ ๋ฆฌ์์ค(์์) ํด๋๋ก ์ฌ์ฉํ๋ค. css, image, media ๋ฑ์ ํ์ผ์ ์ ์ฅํ๋ค.
templates ํด๋: html ํ์ผ ํด๋์ด๋ค. templates ํด๋๋ฅผ ์ฌ์ฉํ ๋ ์ ์์ฌํญ์ flask๋ ๊ธฐ๋ณธ์ ์ผ๋ก view ๋๋๋ง์ ํ ๋ html ํ์ผ์ ํธ์ถํ๋๋ฐ htmlํ์ผ์ ๋ฌด์กฐ๊ฑด templates ํด๋์ ์๋ html ํ์ผ์ ํธ์ถ ํ๊ฒ๋ ์ค์ ์ด ๋์ด ์๋ค. (์ด๋ฆ ์ ์ง)
(๋๋๋ง: ์๋ฒ๋ก๋ถํฐ HTML ํ์ผ์ ๋ฐ์ ๋ธ๋ผ์ฐ์ ์ ๋ฟ๋ ค์ฃผ๋ ๊ณผ์ ์ด๋ค.)
01. index.py ๋ค์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ home ํด๋์ ์ ์ฅํ๋ค.
/home/pi/webapps/ch06/home/index.py
from flask import Flask, request
from flask import render_template
import RPi.GPIO as GPIO
app = Flask(__name__)
GPIO.setmode(GPIO.BOARD) #BOARD๋ ์ปค๋ฅํฐ pin๋ฒํธ ์ฌ์ฉ
GPIO.setup(8, GPIO.OUT, initial=GPIO.LOW)
@app.route("/")
def home():
return render_template("index.html")
@app.route("/led/on")
def led_on():
try:
GPIO.output(8, GPIO.HIGH)
return "ok"
except expression as identifier:
return "fail"
@app.route("/led/off")
def led_off():
try:
GPIO.output(8, GPIO.LOW)
return "ok"
except expression as identifier:
return "fail"
if __name__ == "__main__":
app.run(host="0.0.0.0")
02. index.html ๋ค์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ home ํด๋ ์๋ templates ํด๋์ ์ ์ฅํ๋ค.
/home/pi/webapps/ch06/home/templates/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>HOME NETWORK</title>
#<!--link rel="stylesheet" href="static/style.css">-->
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
<div class="container">
<div class="header">
<h2>HOME IoT</h2>
</div>
<div class="main">
<div>
<button onclick="led_on()">LED ON</button>
</div>
<div>
<button onclick="led_off()">LED OFF</button>
</div>
</div>
<div id="result">
</div>
</div>
<script>
function led_on(){
fetch("/led/on")
.then(response=> { console.log(response); return response.text()})
.then(data=> {
console.log(data);
let result = document.querySelector("#result");
if(data=="ok"){
result.innerHTML = "<h1>LED is runinng</h1>";
}else{
result.innerHTML = "<h1>error</h1>";
}
});
}
function led_off(){
fetch("/led/off")
.then(response=> response.text())
.then(data=> {
console.log(data);
let result = document.querySelector("#result");
if(data=="ok"){
result.innerHTML = "<h1>LED is stopping</h1>";
}else{
result.innerHTML = "<h1>error</h1>";
}
});
}
</script>
</body>
</html>
03. style.css ๋ค์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ home ํด๋ ์๋ static ํด๋์ ์ ์ฅํ๋ค.
/home/pi/webapps/ch06/home/static/style.css
body {
background-color: antiquewhite;
}
.container {
width: 700px;
margin: 0 auto;
text-align: center;
}
.main {
display: flex;
}
.main div {
flex:1;
}
.main div button {
background-color: rgb(192, 114, 114);
width:150px;
height:80px;
border-radius: 10px;
}
4. ์คํ๋ฐฉ๋ฒ์ ํฐ๋ฏธ๋์ ์ด๊ณ ํด๋นํด๋๋ก ์ด๋ํ์ฌ ๋ค์์ ์ ๋ ฅํ๋ค.
python home.py
VSCode ํด์์ ํฐ๋ฏธ๋(TERMINAL)์ ์ด๊ณ ์คํํ ์ ์๋ค.
1) ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด์ด์ ํ์ธํ ๊ฒฝ์ฐ
http://localhost:5000/
2) ๋ค๋ฅธ PC์์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด์ด์ ํ์ธํ ๊ฒฝ์ฐ
http://192.168.0.80:5000/ (์์์)
์ฃผ์๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์์ ํฐ๋ฏธ๋์ ์ด๊ณ ์๋ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ค.
(ex. ์๋์ฐ์ ๊ฒฝ์ฐ cmd: ๋ช
๋ น ํ๋กฌํํธ, ipconfig๋ฅผ ์
๋ ฅํ๋ฉด ip์ฃผ์๊ฐ ๋์จ๋ค.)
$ ifconfig
์์ดํ์ด๋ก ์ฐ๊ฒฐํ๋ค๋ฉด wlan() ๋ถ๋ถ์ ํ์ธํ๋ฉด ๋๊ณ ,
๋์ผ๋ก ์ฐ๊ฒฐํ๋ค๋ฉด eth() ๋ถ๋ถ์ ํ์ธํ๋ค.
wlan(): ์ ์๋ inet์ ํ์ธํ๋ค.
์์) inet 192.168.0.80
์๋์ฐ์ ์์)
3) ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์ ์ฌ์ฉ์ PC๊ฐ ๊ฐ์ ๋คํธ์ํฌ์ธ ๊ฒฝ์ฐ ์๋์ ๊ฐ๋ค.
๋ผ์ฆ๋ฒ ๋ฆฌ -> ๊ณต์ ๊ธฐ <- ๋
ธํธ๋ถ
๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์ ์ฌ์ฉ์ PC๊ฐ ๋ค๋ฅธ ๋คํธ์ํฌ์ธ ๊ฒฝ์ฐ ์๋์ ๊ฐ๋ค.
๋ผ์ฆ๋ฒ ๋ฆฌ -> ๊ณต์ ๊ธฐ, ๋
ธํธ๋ถ -> ๋ค๋ฅธ ๊ณต์ ๊ธฐ
๋ผ์ฆ๋ฒ ๋ฆฌ -> ๊ณต์ ๊ธฐ, ํด๋ํฐ -> (LTE ์ฌ์ฉ) ๊ธฐ์ง๊ตญ
5. ๊ฒฐ๊ณผํ๋ฉด์
๋๋ค.
6. [LED ON] ๋ฒํผ ํด๋ฆญ ๊ฒฐ๊ณผ์
๋๋ค.
7. [LED OFF] ๋ฒํผ ํด๋ฆญ
8. ์ค๋ฅ๋ฅผ ๋ฐ์์ํจ๋ค. index.py์ ์์ ํ๋ค.
@app.route("/led/on")
def led_on():
try:
GPIO.output(9, GPIO.HIGH)
return "ok"
except expression as identifier:
return "fail"
output GPIOํ ๋ฒํธ๋ฅผ 9๋ฒ์ผ๋ก ๋ณ๊ฒฝํ๋ค. LED๋ฅผ ONํ๋ ค๋ ์๊ฐ GPIO 9๋ฒ์ ์ฐ๊ฒฐ๋ LED๋ฅผ ์ฐพ์ง ๋ชปํ๋ฏ๋ก try๋ถ๋ถ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ except ๋ถ๋ถ์ผ๋ก ๋์ด๊ฐ๋ค.
์์ธ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์์ํ์ง ๋ชปํ ์๋ฒ ์ค๋ฅ๋ก ์๋ฒ๊ฐ ๋ฉ์ถ๋ ์ผ์ด ๋ฐ์ํ์ง ์๋๋ค.
9. ๋ค์ ์คํํด๋ณด๋ฉด error๋ฅผ returnํ๊ฒ ๋๋ค.
$ python index.py
์นํผ์ด์ง ๊ฒฐ๊ณผ ํ๋ฉด ํ๋จ์ error ๋ฌธ์๊ฐ ๋์จ๋ค.
5.2 fetch() ํจ์ ์ดํดํ๊ธฐ
fetch: to go after and bring back, get
์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ด๋ค.
ajax๋ฅผ ์ด์ฉํ ๋น๋๊ธฐ ํต์ ์ ํ ๋ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
(์์ ์๋ ajax ์์ฒญ ์์ jQuery๋ฅผ ๋ง์ด ์ฌ์ฉํ๋๋ฐ ์ต๊ทผ์๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ ๊ณตํ๋ fetch๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค.)
fetch๋ฅผ ํตํด์ index.py์ led_on() ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฒ ๋๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ response๋ฅผ ํตํด์ ๋ฐ๋๋ค.
len_on ๋ฉ์๋ ํธ์ถ ์์ ์ค์ led๊ฐ on์ด ๋๋ค.
์ ์์ ์ผ๋ก on์ด ๋๋ฉด ok๋ฅผ returnํ๊ฒ ๋๋ค.
return๋ ๊ฐ์ fetch(), then(response) ์ด ๋ถ๋ถ์์ then()์ด ๋ฐ๊ฒ ๋๋ค.
then()์ fetch๊ฐ ์๋ฃ๋ ํ์ ํธ์ถ์ด ๋๋ค.
5.3 ํ์ดํ ํจ์ ์ดํดํ๊ธฐ
6 IP, Port, Process ๊ฐ๋
์ก๊ธฐ
6.1 IP(internet protocol) ๊ฐ๋
์ก๊ธฐ
6.2 Port ๊ฐ๋ ์ก๊ธฐ
6.3 Process ๊ฐ๋ ์ก๊ธฐ
https://github.com/codingspecialist/RaspberryPi4-Book-Example/blob/master/ch06/process/process.py
from flask import Flask, request
import RPi.GPIO as GPIO
app = Flask(__name__)
LED = 8
GPIO.setmode(GPIO.BOARD) #BOARD๋ ์ปค๋ฅํฐ pin๋ฒํธ ์ฌ์ฉ
GPIO.setup(LED, GPIO.OUT, initial=GPIO.LOW)
@app.route("/led/<state>")
def led(state):
if(state == "on"):
GPIO.output(LED, GPIO.HIGH)
return "LED ON"
elif(state == "off"):
GPIO.output(LED, GPIO.LOW)
return "LED OFF"
else:
return "error"
if __name__ == "__main__":
app.run(host="0.0.0.0")
$ ps -f
05. ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค๋ฅผ ํ์ธํด๋ด ๋๋ค. -e: ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค๋ฅผ ํ์ธํ๋ ์ต์ ์ด๋ค.
06. | grep์ ์ด์ฉํ์ฌ process.py ํ๋ก์ธ์ค๋ง ํ์ธํ๋ค.
$ ps -ef | grep process.py
sudo kill [PID]
PID๊ฐ 2172๋ฒ์ด๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด ์ข
๋ฃํฉ๋๋ค.
The persistent identifier (PID) uniquely identifies a persistent object in any content server.
7 cron๊ณผ daemon ๊ฐ๋
์ก๊ธฐ
7.1 cron(ํฌ๋ก ) ๊ฐ๋
์ก๊ธฐ (์๋ํ)
$ crontab -1
no crontab for pi
The cron command-line utility is a job scheduler on Unix-like operating systems. Users who set up and maintain software environments use cron to schedule jobs, also known as cron jobs, to run periodically at fixed times, dates, or intervals.
webapps
- ch06
- cron
- led.py
# -*- encoding: utf-8 -*-
import RPi.GPIO as GPIO
import time
GPIO.cleanup() #ํ๊ธ
LED = 8
GPIO.setmode(GPIO.BOARD)
GPIO.setup(LED, GPIO.OUT, initial=GPIO.LOW)
try:
num = 0
while(True):
time.sleep(1)
GPIO.output(LED, GPIO.HIGH)
time.sleep(1)
GPIO.output(LED, GPIO.LOW)
num = num + 1
if(num == 5):
GPIO.cleanup()
break
except KeyboardInterrupt:
GPIO.cleanup()
7.2 daemon(๋ฐ๋ชฌ) ๊ฐ๋ ์ก๊ธฐ
webapps
- ch06
- daemon
- led2.py
# ํด๋น ํ์ผ์ ๋ค๋ฅธ ๊ณณ์์ ์คํํ ๋ python ์คํ ํ์ผ์ ์ฌ์ฉํ์ฌ ์คํํ๋ผ
#! /usr/bin/env python #๊ผญ ์ฒจ๋ถํ๋ค. ํ์ด์ฌ ๋ฒ์ ์ด 3.4๋ผ๋ฉด ๋ค์ python3.4๋ผ๊ณ ์ ๋๋ค.
import RPi.GPIO as GPIO
import time
GPIO.cleanup()
LED = 8
GPIO.setmode(GPIO.BOARD)
GPIO.setup(LED, GPIO.OUT, initial=GPIO.LOW)
try:
num = 0
while(True):
time.sleep(1)
GPIO.output(LED, GPIO.HIGH)
time.sleep(1)
GPIO.output(LED, GPIO.LOW)
num = num + 1
if(num == 5):
GPIO.cleanup()
break
except KeyboardInterrupt:
GPIO.cleanup()
fi
-> ์ด ๋ถ๋ถ์ ์คํํ ๊ตฌ๋ฌธ์ ๋ฃ์ผ๋ฉด ๋๋ค. ๋ง์ง๋ง์ &์ ๋ถ์ธ๋ค.
exit 0