如何使用Flask Restful传输url参数

时间:2018-08-13 08:05:51

标签: python

我有一个网址

http://127.0.0.1:5000/feed/arm1?camera_id=1&command=update&value=3

我还有另一个网址

http://127.0.0.1:5000/wait/arm1

当我请求第一个URL时,我想获取第二个URL的参数。 我该怎么办?

1 个答案:

答案 0 :(得分:0)

根据您的澄清,以下是答复

  • 将通过/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()
  1. 我们照常创建烧瓶app
  2. db函数返回到本地sqlite数据库的新数据库连接(如果文件camera_commands.sqlite不存在,则会创建该文件)。
  3. feed函数将参数/feed/<entity>存储在数据库中,并返回OK。注意我在这里如何使用准备好的语句!
  4. wait函数检索最新命令并将其返回到一个简单的html网站中,该网站每秒都会重新加载自身。
  5. setup_db函数清除sqlite文件并创建表。
  6. 在主要部分中设置了数据库并启动了应用程序。

运行程序时,在浏览器中打开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 / arm2保持沉默时,带有/ wait / arm1的浏览器选项卡将接收更新。当您更改Feed的目标时,例如更改为http://127.0.0.1:5000/feed/arm2?camera_id=1&command=update&value=5,/ wait / arm1不会更改,但/ wait / arm2会更改。

当然,所有这些还没有充实,但是应该为您提供有关如何将数据持久存储在服务器上并在客户端上进行轮询的足够的想法。