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 服务的机制。 这里描述的机制与之前描述的机制不同,因为 −
- 在函数中包含参数。
- 该函数必须在模型中定义。
- 它强制执行更严格的网址命名约定。
- 它适用于一组固定的协议,并且易于扩展。
- 要使用此功能,需要导入并启动服务对象。
要实现此机制,首先必须导入并实例化一个服务对象。
from gluon.tools import Service service = Service()
这是在 scaffolding 应用程序的"db.py"模型文件中实现的。 Db.py模型是web2py框架中的默认模型,它与数据库和控制器交互以实现向用户期望的输出。
实现后,可以在需要时从控制器访问模型中的服务。
以下示例展示了使用 Web 服务等进行远程过程调用的各种实现。
Web 服务
Web 服务可以定义为使用 XML、SOAP、WSDL 和 UDDI 等协议集成基于 Web 的应用程序的标准化方法。
web2py 支持其中的大多数,但集成会相当棘手。
使用 jQuery 使用 web2py JSON 服务
有很多方法可以从 web2py 返回 JSON 形式,但这里我们考虑 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 不需要位于控制器中,可以位于模型中。
call 始终位于 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"> 后面加上 <br/>。
通过这种方式,web2py 使用 jQuery.getJSON 管理 Web 服务的实现。