파이썬(Python)/웹서버

flask, pyserial 동시에 사용하기

끄적끄적아무거나 2020. 12. 17. 15:43
반응형

 

이번 주제는 flask로 웹서버를 동작시키면서 동시에 serial 통신으로 아두이노로 부터 값을 계속 받아오고 싶었다.

 

처음에 사용한것은 thread 모듈이었는데 웹서버와 같이 thread를 돌리는 방법은 시도하다가 잘안되서 포기하였다.

 

그렇게 찾은 것이 flask의 Response 함수 였다. Reponse는 말그대로 실시간 (on the fly)로 데이터를 처리해주는 것이다.

 

아래 링크를 통해 공부하였다.

 

https://flask.palletsprojects.com/en/1.1.x/patterns/streaming/

 

Streaming Contents — Flask Documentation (1.1.x)

Streaming Contents Sometimes you want to send an enormous amount of data to the client, much more than you want to keep in memory. When you are generating the data on the fly though, how do you send that back to the client without the roundtrip to the file

flask.palletsprojects.com

 

내가 작성한 코드를 보고 이해해보도록 하자.

 

코드>>

from flask import Flask
from flask import request
from flask import render_template
from flask import Response
# from threading import Thread
import serial


web_gui = Flask(__name__)

def serial_start():
    ser = serial.Serial('com18', 115200)
    stop_flag = False 
    while not stop_flag:
        if ser.readable():        
            res = ser.readline()
            res_decode = res.decode()
            print(res_decode)

@web_gui.route('/')
def hello_fnc():
    Response(serial_start())
    return 'Hello'

@web_gui.route("/page", methods = ["GET", "POST"])
def page_fnc():
    if request.method == "POST":
        return 'POST received'
    else:
        return render_template("page.html")  

web_gui.run(debug=True, port=9999)    

 

주석>>

serial_start 함수는 Response에서 계속 응답해주는 것이다.

 

http://localhost:9999/ 에 접속하자마자 serial_start 함수가 동작하면서 아두이노에서 보낸 값들이 아래 그림처럼 print 되기 시작했다.

 

값들이 지속적으로 올라오는 와중에 http://localhost:9999/page 접속도 아래 그림처럼 문제 없이 되었다.

 

 

 

 

 

 

 

반응형