如何从我的本地机器到web2py进行通信?

时间:2017-08-24 23:08:36

标签: python api port web2py xml-rpc

我需要创建一个python函数,它可以从我的本地机器将消息发布到web2py服务器上。换句话说,我希望在我的web2py的网址上看到我用我的功能发布的消息:http://127.0.0.1:8000/application/controller/view

根据Web2Py documentation,我创建了以下控制器:

@service.xmlrpc
def view(message_from_local_machine):
    return message_from_local_machine

def call():
    return service()

我还将view.html创建为

<h1>{{=message}}</h1>

在我的本地机器上,我尝试了以下

from xmlrpclib import ServerProxy
server = ServerProxy('http://127.0.0.1:8000/application/controller/call/xmlrpc')
server.view('my message from my local machine')
#This returns 'my message from my local machine'

就像web2py documentation所说的那样,我可以调用名为&#39; view&#39;远程。但是,当我访问以下网址时,我使用的消息不会显示: &#39; http://127.0.0.1:8000/application/controller/view&#39;

相反,我从web2py获得以下消息:

无效功能(控制器/视图)

我已完成研究并找到this question,但它说我可以将请求lib或pyserial与Web2Py一起使用,但没有说明如何实现。这个question建议使用qpid.apache.org,但也没有指定如何实现Web2Py。

1 个答案:

答案 0 :(得分:1)

首先,用@xmlrpc修饰的函数是通过XML-RPC客户端访问的,而不是通过浏览器访问。

其次,如果您确实想从浏览器访问服务,则正确的URL格式为:

http://127.0.0.1:8000/application/controller/call/xmlrpc/view?message_from_local_machine=your_url_encoded_message

当然,上述URL无法正常工作,因为浏览器不是XML-RPC客户端(响应将是XML错误消息)。

如果您想从浏览器调用view功能,您可以另外将其装饰为xml服务:

@service.xmlrpc
@service.xml
def view(message_from_local_machine):
    return dict(result=message_from_local_machine)

在这种情况下,您需要更改网址以指定xml而不是xmlrpc

http://127.0.0.1:8000/application/controller/call/xml/view?message_from_local_machine=your_url_encoded_message

另请注意,上面的返回值已更改为dict - 如果只返回一个字符串,则会出现格式错误的XML。

最后,请注意view函数不是可通过URL直接访问的web2py操作。相反,它是一个注册为web2py服务的函数,因此只能通过返回service()对象的操作进行访问(在这种情况下,call操作已设置为返回service() ,因此可以通过/default/call/[type_of_service]/[name_of_function])访问注册为服务的任何功能。

更一般地说,控制器中接受参数或以双下划线开头的任何函数都不能作为URL的动作直接访问。此外,在定义服务功能时,没有特别的原因它们必须进入控制器 - 它们可以在模型文件中定义,甚至可以在模块中定义。它们必须使用@service装饰器进行修饰。