根据您的说明,以下是回复
- 将通过
/feed/<entity> 接收的数据保存到数据库中
- 通过
/wait/<entity> 从该数据库中检索数据
由于您只要求服务器端,我没有包含正确的 JavaScript 代码或任何用于在调用 /wait 的客户端上进行轮询的任何内容,而是使用 meta http-equiv="refresh"。该代码还使用records 来简洁——您也可以只写入文件或想出另一种持久化数据的想法。这只是一个例子。
事不宜迟,这里是代码(下面的解释——我省略了文档字符串以保持简洁):
from flask import Flask, request
from records import Database
app = Flask(__name__)
def db():
return Database('sqlite:///camera_commands.sqlite')
@app.route('/feed/<entity>')
def feed(entity):
args = ['camera_id', 'command', 'value']
result = db().query('INSERT INTO commands (entity, camera_id, command, value) '
'VALUES (:entity, :camera_id, :command, :value)',
entity=entity,
camera_id=int(request.args.get('camera_id')),
command=request.args.get('command'),
value=int(request.args.get('value')))
return 'OK'
@app.route('/wait/<entity>')
def wait(entity):
result = db().query('SELECT * FROM commands WHERE entity = :entity ORDER BY id DESC LIMIT 1', entity=entity)
output = result.export('json')
return f"""\
<!DOCTYPE html>
<html>
<head>
<title>Wait</title>
<meta http-equiv="refresh" content="1"/>
</head>
<body>
<pre>{output}</pre>
</body>
</html>
"""
def setup_db(db):
db.query('DROP TABLE IF EXISTS commands')
db.query('CREATE TABLE commands (id INTEGER PRIMARY KEY, entity TEXT, camera_id INTEGER, command TEXT, value INTEGER)')
if __name__ == '__main__':
setup_db(db())
app.run()
- 我们照常创建一个 Flask
app。
-
db 函数返回到本地 sqlite 数据库的新数据库连接(如果文件 camera_commands.sqlite 不存在,它会创建它)。
-
feed 函数将/feed/<entity> 的参数存储在数据库中并返回OK。请注意我在这里如何使用准备好的语句!
-
wait 函数检索最新命令并将其返回到一个简单的 html 网站中,该网站每秒重新加载一次。
-
setup_db 函数清除 sqlite 文件并创建表。
- 在主要部分中设置了数据库并启动了应用程序。
运行程序时,在浏览器中打开http://127.0.0.1:5000/wait/arm1(也可以选择http://127.0.0.1:5000/wait/arm2)。现在调用例如
http://127.0.0.1:5000/feed/arm1?camera_id=1&command=update&value=3
或者
http://127.0.0.1:5000/feed/arm1?camera_id=1&command=start&value=1
等等
带有 /wait/arm1 的浏览器选项卡接收更新,而 /wait/arm2 保持静默。当您更改提要的目标时,例如到http://127.0.0.1:5000/feed/arm2?camera_id=1&command=update&value=5,/wait/arm1 不变,但 /wait/arm2 不变。
当然,所有这些都没有充实,但它应该为您提供有关如何在服务器上持久保存数据并在客户端上轮询数据的足够想法。