2017-05-05 70 views
-1

所以我试图创建一个通过Volumio的REST API(文档在这里:https://volumio.github.io/docs/API/REST_API.html)与音乐服务器Volumio交互的小程序。基本上,我的程序应该将命令作为输入,将其翻译为REST API请求,发送请求并打印出歌曲的状态和标题。我承认在这里输入一个无效的命令是有空间的,但目前它不是我关心的问题。我担心输入命令后的输出是错误的。下面是代码:Python:在循环内更新

import json 
import requests 

def controls(cmd): 
     volumio = requests.get("http://volumio.local:3000/api/v1/getstate") 
     vol_data = volumio.text 
     py_data = json.loads(vol_data) 
     if cmd == 'getstate': 
       print(py_data['title'], py_data['status']) 
     else: 
       requests.get("http://volumio.local:3000/api/v1/commands/?cmd=%s" % cmd) 
       print(py_data['title'], py_data['status']) 
while True: 
     input = raw_input('Command: ') 
     controls(input) 

基本上,提交例如命令 '暂停' 后,输出应该是:

(u'04 - The Woods.mp3', u'pause') 

然后在“再次play'ing:

(u'04 - The Woods.mp3', u'play') 

'next'应该简单地改变歌曲名称并保持相同的状态。但这里是我的输出,当我运行:

Command: play 
(u'04 - The Woods.mp3', u'pause') 
Command: play 
(u'04 - The Woods.mp3', u'play') #showing the state from line 1 command 
Command: getstate 
(u'04 - The Woods.mp3', u'play') #shows correct updated state 
Command: next 
(u'04 - The Woods.mp3', u'play') #showing wrong song title 
Command: getstate 
(u'A.T.A.B.', u'play') #updated and showing correct song title from line 7 
Command: pause 
(u'A.T.A.B.', u'play') 
Command: play 
(u'A.T.A.B.', u'pause') 
Command: 

我的输出似乎是一个循环的背后,我想不通为什么。

+0

嗨,因为你正在读取第二个requests.get()之前设置的py_data。从第二个requests.get的结果被扔掉,因为没有变量分配返回值 – Nick

回答

1

因为这就是您在脚本中订购它的方式。您始终调用getstate端点,该端点显示您执行的最后一个命令,并将该结果解析为py_data。现在,如果您输入了实际的命令,则也会发送该命令,但是会输出py_data的内容 - 您尚未更新该内容。

假设发送命令的结果是当前状态,您应该调用json.loads作为else块中的结果,并打印该结果。

编辑好的,这是一个重新配置的函数,更有意义。

def controls(cmd): 
    if cmd != 'getstate': 
     requests.get("http://volumio.local:3000/api/v1/commands/?cmd=%s" % cmd) 
    volumio = requests.get("http://volumio.local:3000/api/v1/getstate") 
    vol_data = volumio.text 
    py_data = json.loads(vol_data) 
    print(py_data['title'], py_data['status']) 

这里你执行命令,如果有的话,然后进行getstate调用。

+0

嗯..实际上,第二个requests.get()(发出命令的那个)不会返回任何数据。至少没有任何有用的数据。也许我不应该使用requests.get(),因为我只是用这行发出命令。请requests.post()更常规(即使我不推动任何额外的数据)?除此之外,我不明白为什么py_data没有更新。即使在将getstate请求移动到命令请求下方之后。 –

+0

这不是get或post是更传统的问题,而是api预期的问题。不过,通常你会使用post来进行状态更改。请注意,我已经用一些建议的代码更新了答案。 –

+0

是的,我已经将我的代码更改为类似于您的建议(我认为)的东西......发布这里太长了,但它在这个注释中的reddit线程中:[https://www.reddit.com/r/learnpython/comments/69dsq1/code_help /]仍然看起来像是一件有趣的事情。 –

1
def controls(cmd): 
    volumio = requests.get("http://volumio.local:3000/api/v1/getstate") 
    vol_data = volumio.text 
    py_data = json.loads(vol_data) 
    if cmd == 'getstate': 
      print(py_data['title'], py_data['status']) 
    else: 
      r = requests.get("http://volumio.local:3000/api/v1/commands/?cmd=%s" % cmd) 
      py_data = r.json() 
      print(py_data['title'], py_data['status'])