为什么使用http.route()方法使用type =" json"在openerp

时间:2014-03-24 10:33:42

标签: json openerp

来自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"的情况以及为什么...... ??

3 个答案:

答案 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方法进行通信。这意味着以下内容:

  • 客户端发送以url(GET方法)或http正文(POST方法)编码的请求
  • 服务器返回与请求对应的对象。可以是html页面,PNG图像,CSS文件,JavaScript,XML编码数据等等。

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"}