如何将HTML表单数据保存至服务器并在Raspberry Pi项目中调用?
嘿,这个需求我熟!刚好树莓派上用轻量的技术栈就能搞定,我给你一步步拆解:
整体思路
咱们需要搭一个轻量的后端服务来接收表单提交的数据,把数据存在本地数据库里(用SQLite就够,不用额外装数据库服务),之后树莓派的项目要么直接读数据库,要么通过后端接口拿数据就行。我用Flask来做后端,它简单易部署,完美适配树莓派。
第一步:准备树莓派的后端环境
先在树莓派上装必要的依赖包,打开终端跑这个命令:
pip install flask flask-sqlalchemy
flask是后端框架,flask-sqlalchemy帮咱们简化数据库操作。
第二步:编写后端代码(app.py)
新建一个叫app.py的Python文件,把下面的代码粘进去——我已经加了注释,你能看懂每部分干啥的:
from flask import Flask, request from flask_sqlalchemy import SQLAlchemy from datetime import datetime # 初始化Flask应用 app = Flask(__name__) # 配置SQLite数据库,文件会存在当前目录的events.db里 app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///events.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) # 定义数据模型:存事件名称和创建时间 class Event(db.Model): id = db.Column(db.Integer, primary_key=True) event_name = db.Column(db.String(100), nullable=False) # 事件名称,不能为空 created_at = db.Column(db.DateTime, default=datetime.utcnow) # 自动记录提交时间 # 第一次运行时创建数据库表 with app.app_context(): db.create_all() # 处理表单提交的接口 @app.route('/save-event', methods=['POST']) def save_event(): # 从表单里拿用户输入的Event字段 event_name = request.form.get('Event') if event_name: # 创建新的事件记录并存入数据库 new_event = Event(event_name=event_name) db.session.add(new_event) db.session.commit() return "事件保存成功!" return "请输入事件名称哦~" # 供树莓派项目调用的获取数据接口 @app.route('/get-events', methods=['GET']) def get_events(): # 按时间倒序获取所有事件 events = Event.query.order_by(Event.created_at.desc()).all() # 转成JSON格式方便解析 event_list = [{"id": e.id, "event": e.event_name, "date": e.created_at.strftime("%Y-%m-%d %H:%M:%S")} for e in events] return {"events": event_list} # 启动服务:允许外部访问,端口用5000,调试模式方便开发 if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True)
第三步:修改你的前端表单代码
原来的表单没指定提交地址和方法,得改一改。把你的HTML存到一个templates文件夹里(Flask默认找这个文件夹下的模板),命名为index.html,修改后的代码如下:
<div class='alertBox' id='box'> <p id='displayDate'></p> <br> <!-- 指定表单提交到咱们后端的/save-event接口,用POST方法 --> <form action="/save-event" method="POST"> <input name='Event' type='text' placeholder='Event'> <br> <input type='submit' name='save' value='save'> </form> <br> <a onclick='unpop()' class='close'>Close</a> </div> <!-- 可选:给displayDate加上当前时间 --> <script> document.getElementById('displayDate').textContent = new Date().toLocaleString(); function unpop() { document.getElementById('box').style.display = 'none'; } </script>
第四步:部署和测试
- 在终端里进入
app.py所在的目录,跑python app.py启动服务。 - 打开浏览器,访问
http://你的树莓派IP地址:5000,输入事件点save,数据就会存在events.db里了。 - 访问
http://你的树莓派IP地址:5000/get-events,就能看到所有事件的JSON数据啦。
第五步:在树莓派项目中使用数据
有两种简单的方式:
- 直接读SQLite数据库:如果你的树莓派项目是Python写的,直接连数据库查数据:
import sqlite3 # 连接数据库 conn = sqlite3.connect('events.db') cursor = conn.cursor() # 查询所有事件(按时间倒序) cursor.execute("SELECT event_name, created_at FROM event ORDER BY created_at DESC") events = cursor.fetchall() # 打印结果 for event in events: print(f"事件:{event[0]},提交时间:{event[1]}") # 关闭连接 conn.close()
- 通过后端API获取:用
requests库调用接口拿数据:
import requests # 调用本地的get-events接口 response = requests.get('http://localhost:5000/get-events') if response.status_code == 200: events = response.json()['events'] for event in events: print(f"ID: {event['id']}, 事件: {event['event']}, 时间: {event['date']}")
小提醒
- 如果要从外部设备访问树莓派的服务,记得开放5000端口,终端跑
ufw allow 5000就行(如果开了防火墙的话)。 - 调试模式别在正式环境用,稳定运行的话可以换Gunicorn或者uWSGI来启动Flask服务。
- 要加更多表单字段的话,只需要修改
Event模型和前端对应的输入框就行。
内容的提问来源于stack exchange,提问作者Max Bauer
相关产品推荐
相关产品推荐

