본문 바로가기
공부,일/라즈베리 파이

Flask 이용해서 웹서버 구축 및 이용

by fromnothing1 2021. 8. 12.
from flask import Flask

app = Flask(__name__)
@app.route("/")
def helloworld():
        return "Hello World"


if __name__ == "__main__": // import 된게 아니라 main 으로 실행될때 
        app.run(host="0.0.0.0")

cf) __name__ 속성은 각 파일이 들고 있는데 각 파일이 import 되지 않고 main(진입점) 으로  시작 된다면 __name__ 은 __main__ 값을 갖는다. 

즉 if 문은 파일이 main 으로 실행 되었을때 실행 되는 코드이다. 

 

web 주소에 ip 주소를 치면 라즈베리 파이로 만든 웹 서버로 접속 가능하다. 

포트 번호는 기본적으로 5000 번이다. 

 

 

web 서버를 통한 LED 제어 

회로 구축

 

GPIO 14 번 핀을 이용 해서 LED 제어 

#!/usr/bin/python
#-*- coding:utf-8 -*-
from flask import Flask # flask 디렉토리에서 Flask 파일 불러옴
import RPi.GPIO as GPIO

LED_PIN = 14
LED_STATE = GPIO.LOW
OBJECT_FLASK = Flask(__name__) #Flask 객체 생성 (Flask 는 클래스임)

def Init_LED():
	GPIO.setwarnings(False)
	GPIO.setmode(GPIO.BCM)
	GPIO.setup(LED_PIN, GPIO.OUT)
	GPIO.output(LED_PIN, GPIO.LOW)

@OBJECT_FLASK.route("/") #데코레이터 
def Start_Main():
	global LED_STATE
	LED_STATE = not LED_STATE // LED 토글
	GPIO.output(LED_PIN, LED_STATE)
	return "강사컴 LED ON/OFF"

if __name__ == "__main__":
	Init_LED()
	OBJECT_FLASK.run(host="0.0.0.0")

web 에 접솔할때 마다 LED 가 켜졌다가 꺼졋다가 한다. 

 

정적 라우팅

 

#!/usr/bin/python
#-*- coding:utf-8 -*-
from flask import Flask
import RPi.GPIO as GPIO

LED_PIN = 14
OBJECT_FLASK = Flask(__name__)

def Init_LED():
        GPIO.setwarnings(False)
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(LED_PIN, GPIO.OUT)
        GPIO.output(LED_PIN, GPIO.LOW)

@OBJECT_FLASK.route("/")
def Start_Main():
        return "<h1>스마트 팩토리</h1>"
###################################
@OBJECT_FLASK.route("/led/on")
def LED_on():
        GPIO.output(LED_PIN,GPIO.HIGH)
        return " 스마트 팩토리  LED ON"
###################################
@OBJECT_FLASK.route("/led/off")
def LED_off():
        GPIO.output(LED_PIN,GPIO.LOW)
        return "스마트 팩토리  LED OFF"
###################################

if __name__ == "__main__":
        Init_LED()
        OBJECT_FLASK.run(host="0.0.0.0")
        GPIO.cleanup()
        print("Flask 종료")

 

접근 주소를 led/on 하면 전구가 켜지고 led/off 하면 전구가 꺼진다. 

 

<> 활용 라우팅

아래의 코드에서 처럼 <> 를 사용해서 routing 할 변수를 선언 할 수 있다. 

#!/usr/bin/python
#-*- coding:utf-8 -*-
from flask import Flask
import RPi.GPIO as GPIO

LED_PIN = 14
OBJECT_FLASK = Flask(__name__)

def Init_LED():
        GPIO.setwarnings(False)
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(LED_PIN, GPIO.OUT)
        GPIO.output(LED_PIN, GPIO.LOW)

@OBJECT_FLASK.route("/")
def Start_Main():
        return "<h1>스마트 팩토리</h1>"
###################################
@OBJECT_FLASK.route("/led/<State>")
def LED_on_off(State):
        if State == "on":
                GPIO.output(LED_PIN,GPIO.HIGH)
        if State == "off":
                GPIO.output(LED_PIN,GPIO.LOW)
        return "<h1> LED " + State +"</h1>"
###################################

if __name__ == "__main__":
        Init_LED()
        OBJECT_FLASK.run(host="0.0.0.0")
        GPIO.cleanup()
        print("Flask 종료")

 

 

쿼리 스트링 방식 라우팅 

request 를 사용한다. 

#!/usr/bin/python
#-*- coding:utf-8 -*-
from flask import Flask
from flask import request
import RPi.GPIO as GPIO

LED_PIN = 14
OBJECT_FLASK = Flask(__name__)

def Init_LED():
        GPIO.setwarnings(False)
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(LED_PIN, GPIO.OUT)
        GPIO.output(LED_PIN, GPIO.LOW)

@OBJECT_FLASK.route("/")
def Start_Main():
        return "<h1>스마트 팩토리</h1>"


###################################
@OBJECT_FLASK.route("/led")
def LED_on_off():
        State = request.args.get("state")
        if State == "on":
                GPIO.output(LED_PIN,GPIO.HIGH)
        elif State == "off":
                GPIO.output(LED_PIN,GPIO.LOW)
        elif State == "error":
                State = State + "에러 1"
        else:
                State = "에러 2"
        return "<h1> LED " + State +"</h1>"
###################################


if __name__ == "__main__":
        Init_LED()
        OBJECT_FLASK.run(host="0.0.0.0")
        GPIO.cleanup()
        print("Flask 종료")

 

 

댓글