来自website_mail
模块控制器文件email_designer.py
文件的代码
类WebsiteEmailDesigner(http.Controller):
@http.route('/website_mail/email_designer/<model("email.template"):template>/', type='http', auth="user", website=True, multilang=True)
def index(self, template, **kw):
values = {
'template': template,
}
return request.website.render("website_mail.designer_index", values)
@http.route(['/website_mail/snippets'], type='json', auth="user", website=True)
def snippets(self):
return request.website._render('website_mail.email_designer_snippets')
我们使用type="json"
和type="http"
的情况以及为什么...... ??
答案 0 :(得分:2)
基本上type =“json”用于从控制器传递数据,其中type =“html”用于响应http请求。
例如,从上面的代码: 网址“/ website_mail / email_designer //”将响应任何特定的http请求并路由到其网页,其中网址“/ website_mail / snippets”只会将json数据传递到其呈现的模板,但没有与之相关的物理网页这个网址。
答案 1 :(得分:2)
接收JSON的方法可以通过传递&#39; json&#39;来定义。到http.route()的类型参数。 OpenERP Javascript客户端可以使用JSON-RPC协议联系这些方法。 JSON方法必须返回JSON。与HTTP方法一样,它们将参数作为命名参数接收(除了这些参数是JSON-RPC参数)。
@http.route('/division', type="json")
def division(self, i, j):
return i / j # returns a number
答案 2 :(得分:1)
它们都是关于客户端和服务器之间的通信。 HttpRequest通过众所周知的GET和POST方法进行通信。这意味着以下内容:
JsonRequest是另一种用于客户端/服务器通信的协议的实现 - JSON-RPC 2.0。您可能希望从here获取更多信息。它是一个远程过程调用(RPC)协议,这意味着它允许客户端在服务器上启动某些方法的执行,并将一些参数传递给此方法。作为响应,客户端通过方法调用获取一些数据。
编辑 - 关于装饰者@ openerpweb.jsonrequest和@openerpweb.httprequest的更多话语
一些方法用@openerpweb.jsonrequest装饰器,其他方法装饰 - 使用@openerpweb.httprequest。这意味着除了第一组方法可以通过JSON RPC协议执行,第二组可以通过纯HTTP协议访问。
现在,有什么区别?我需要jsonrequest和httprequest吗?让我们像这样简化:JSON更适合在服务器上执行方法并获得结果。当我们访问服务器上的某些资源时,HTTP更简单,更容易使用。
为了清楚起见,让我们用一些例子“装饰”这个。看一下web.controllers.main.Export类的以下方法:
@openerpweb.jsonrequest
def formats(self, req):
""" Returns all valid export formats
:returns: for each export format, a pair of identifier and printable name
:rtype: [(str, str)]
"""
...
此方法接受一些参数并返回包含所有已知导出格式的列表(Python列表对象)。它将在客户端的某些python代码中以编程方式调用。
另一方面是'http'方法 - 就像web.controllers.main.Web类的方法css():
@openerpweb.httprequest
def css(self, req, mods=None):
....
所有这个方法都是将CSS文件返回给客户端。这是一个简单的操作,如访问图像,HTML网页或服务器上的任何其他资源。我们在这里返回的资源与上一个示例中的Python列表一样复杂。我们不需要特殊格式来对其进行编码。因此,我们不需要额外的数据编码格式作为JSON和远程过程调用协议作为JSON RPC。
<强>类型= “JSON”:强>
它会将JSONRPC作为http.route()的参数调用,所以在这里,只有JSON数据能够通过JSONRPC传递,它只接受json数据对象作为参数。
<强>类型= “HTTP”:强>
与JSON相比,http会将http请求参数传递给http.route()而不是json数据。 实例
@http.route('demo_html', type="http") // Work Pefrect when I call this URL
def some_html(self):
return "<h1>This is a test</h1>"
@http.route('demo_json', type="json") // Not working when I call this URL
def some_json(self):
return {"sample_dictionary": "This is a sample JSON dictionary"}