Web2py服务


web2py提供对XML,JSON,RSS,CSV,XMLRPC,JSONRPC,AMFRPC和SOAP等各种协议的支持。这些协议中的每一个都有多种支持方式,我们区分

  • 以给定格式渲染函数的输出。
  • 远程过程调用。

呈现词典

考虑下面的代码来维护会话的计数。

def count():
   session.counter = (session.counter or 0) + 1
   return dict(counter = session.counter, now = request.now)

上述功能增加了用户访问页面时的计数数量。假设给定的函数是在web2py应用程序的 default.py 控制器中定义的。该页面可以通过以下URL进行请求 - http://127.0.0.1:8000/app/default/count

web2py可以使用不同的协议呈现上述页面,并通过向URL添加扩展名,例如 -

http://127.0.0.1:8000/app/default/count.html

http://127.0.0.1:8000/app/default/count.xml

http://127.0.0.1:8000/app/default/count.json

上述操作返回的字典将以HTML,XML和JSON格式呈现。

远程过程调用

web2py框架提供了一种将函数转换为Web服务的机制。这里描述的机制不同于之前描述的机制,因为

  • 在函数中包含参数。
  • 该功能必须在模型中定义。
  • 它强制执行更严格的URL命名约定。
  • 它适用于一组固定的协议,并且易于扩展。
  • 要使用此功能,需要导入并启动服务对象。

要实现这种机制,首先必须导入并实例化一个服务对象。

from gluon.tools import Service
service = Service()

这在脚手架应用程序的 “db.py” 模型文件中实现。 Db.py 模型是web2py框架中的默认模型,它与数据库和控制器交互以实现向用户提供所需的输出。

实施后,可以根据需要从控制器访问模型中的服务。

以下示例显示了使用Web服务等进行远程过程调用的各种实现。

网页服务

Web服务可以定义为使用XML,SOAP,WSDL和UDDI等协议来集成基于Web的应用程序的标准化方法。

web2py支持其中的大部分,但整合将非常棘手。

使用jQuery使用web2py JSON服务

有很多方法可以返回JSON格式的web2py,但在这里我们考虑一下JSON服务的情况。例如 -

def consumer():return dict()@service.json
def get_days():return ["Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat"]
def call():return service()

在这里,我们观察到

  • 该函数只是返回一个空字典来渲染视图,这将消耗服务。

  • get_days 定义服务,并且函数调用公开所有注册的服务。

  • get_days 不需要在控制器中,并且可以在模型中。

  • 调用 总是在default.py脚手架控制器中。

查看消费者的行为如下

{{extend 'layout.html'}}
<div id = "target"></div>

<script>
   jQuery.getJSON("{{= URL('call',args = ['json','get_days'])}}",
      function(msg){
         jQuery.each(msg, function(){ jQuery("#target").
         append(this + "<br />"); } )
      }
   );
</script>

jQuery.getJSON 的第一个参数是以下服务的URL: http://127.0.0.1:8000/app/default/call/json/get_days

这总是遵循模式

http://<domain>/<app>/<controller>/call/<type>/<service>

该URL位于 {{...}}之间 ,因为它在服务器端解析,而其他所有内容都在客户端执行。 jQuery.getJSON 的第二个参数是一个回调,它将传递JSON响应。

在这种情况下,回调遍历在响应(星期几为字符串的列表)的每个项目,并追加的每个字符串,随后
<DIV ID ="target"> 。 通过这种方式,web2py使用 jQuery.getJSON 管理Web服务的 实现