【问题标题】:how to use flask restful to transfer url params如何使用flask restful来传输url参数
【发布时间】:2018-08-13 08:05:50
【问题描述】:

我有一个网址

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 的参数。 我该怎么做?

【问题讨论】:

  • 我想帮忙,但我不明白你的意思?请求是无状态的。您仍然希望在处理第二个请求时获得第一个请求的某些内容。如果是,那么这应该由客户端处理,而不是服务器。
  • 如果我理解正确,您想从feed 重定向到wait,那么有几个选项,例如stackoverflow.com/a/18102521stackoverflow.com/a/17061023
  • 也许我描述得不清楚 “feed”:我可以使用浏览器请求 “wait”:我在这里等待如果“feed”传输消息我可以通过“wait”接收它,如果 get_message_by_feeding() 是不是无:wait_to_get_message 并做其他事情:什么都不做,你能帮我吗,非常感谢你
  • 那么您的意思是您有一个 URL(供稿)供一个客户端(您的相机)发送参数,还有一个 URL(等待)供检索参数?
  • 是的,是的,是的,我同时使用浏览器发送了我的参数,如果我等待某事,我会做某事,所以我想知道如何编写服务器代码

标签: python


【解决方案1】:

根据您的说明,以下是回复

  • 将通过/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. 我们照常创建一个 Flask app
  2. db 函数返回到本地 sqlite 数据库的新数据库连接(如果文件 camera_commands.sqlite 不存在,它会创建它)。
  3. feed 函数将/feed/&lt;entity&gt; 的参数存储在数据库中并返回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/arm1 的浏览器选项卡接收更新,而 /wait/arm2 保持静默。当您更改提要的目标时,例如到http://127.0.0.1:5000/feed/arm2?camera_id=1&command=update&value=5,/wait/arm1 不变,但 /wait/arm2 不变。

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

【讨论】:

  • 也许我描述得不清楚 “feed”:我可以使用浏览器请求 “wait”:我在这里等待如果“feed”传输消息我可以通过“wait”接收它,如果 get_message_by_feeding() 是不是无:wait_to_get_message 并做其他事情:什么都不做,你能帮我吗,非常感谢你
  • 我根据您的说明更新了答案,现在对您有帮助吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多