파이썬(Python)/웹서버

post form 으로 보낸 데이터 mongodb에 저장하기

끄적끄적아무거나 2020. 12. 14. 17:39
반응형

 

이 프로젝트의 최종 목적은 아두이노에서 모은 가스, 온도, 습도 정보를 web GUI(Graphic User Interface)로 표현하는 것이다.

 

우선 첫단계로 일반적인 페이지에서 정보를 받아서 POST form으로 서버의 DB에 저장하는 예제를 실행하겠다.

 

파이썬 flask로 web GUI를 만들 예정이고, db는 Mongo 를 이용할 것이다.

 

코드-data_send.html>>

 

<html>
    <body>
        <table>
            <form name="data_send" method="POST" action="/data_send">
                <tr>
                    <td>raw data0</td>
                    <td><input type = "text" name="raw_data0"></td>
                </tr>
                <tr>
                    <td colspan="2"><input type="submit"></td>
                </tr>
            </form>
        </table>
    </body>
</html>

 

주석-data_send.html>>

form으로 묶어서 POST를 보내는 것이다. action은 form을 진행한 다음 동작인데 그냥 원래 위치 그대로 유지한다.

raw_data0을 동일한 이름으로 name에 묶어서 보내주는 역할을 한다.

 

코드- run.py>>

 

from flask import Flask
from flask import request
from flask import render_template
from flask_pymongo import PyMongo
from datetime import datetime


web_gui = Flask(__name__)
web_gui.config["MONGO_URI"] = "mongodb://localhost:27017/webgui_project"
mongo = PyMongo(web_gui)

@web_gui.route("/data_send", methods = ["GET", "POST"])
def collect_data():
    if request.method == "POST":
        raw_data0 = request.form.get("raw_data0")
        current_utc = round(datetime.utcnow().timestamp()*1000)
        print(raw_data0)
        print(current_utc)

        data = mongo.db.board
        post = {
            "raw_data0" : raw_data0,
            "utc_stamp" : current_utc,
        }

        data.insert_one(post)

        return ""
    else:
        return render_template("data_send.html")

if __name__ == "__main__":
    web_gui.run(debug=True, port=9999)

 

 

주석-run.py>>

web_gui = Flask(__name__) 에서 Flash 객체를 instance 한다.

 

web_gui.config["MONGO_URI"] = "mongodb://localhost:27017/webgui_project" 는 기존에 mongodb를 연결하는 환경 변수를 설정하는 것인데 mongodb를 설정할때 동일 PC 27017번 port를 사용했으므로 위처럼 연결 해준다.

 

mongo = PyMongo(web_gui) 는 Flash 인스턴스를 mongdb와 연결하는 작업이다.

 

@web_gui.route("/data_send", methods = ["GET", "POST"]) 는 /data_send에서 GET이나 POST로 요청이 오면 아래 함수를 실행시키라는 의미이다.

 

data = mongo.db.board

post = {

"raw_data0" : raw_data0,

"utc_stamp" : current_utc,

}

 

data.insert_one(post)

 

POST가 들어 올 경우 raw_data0 값을 받아서 위처럼 db에 넣어준다.

 

web_gui.run(debug=True, port=9999) 는 코드를 바꿀때마다 파이썬을 다시 실행할 필요없이 refresh만으로 적용 되게 끔 debug를 true로 하였고 web 서버에 접속할때 9999번 포트를 통해 접속하게 만들었다.

 

결과>>

 

 

data_send.html 페이지에 위와 같이 12345를 입력함

 * Serving Flask app "run" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 161-061-830
 * Running on http://127.0.0.1:9999/ (Press CTRL+C to quit)
127.0.0.1 - - [14/Dec/2020 17:21:53] "GET /data_send HTTP/1.1" 200 -
12345
1607901722734
127.0.0.1 - - [14/Dec/2020 17:22:02] "POST /data_send HTTP/1.1" 200 -

 

raw_data0과 utc가 print 되어서 나왔다.

해당 결과가 db에 위처럼 저장되었다.

 

 

 

 

 

반응형