我需要创建一个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。
答案 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
装饰器进行修饰。