2014-03-24 15 views
0

以上代碼從website_mail模塊控制器文件email_designer.py文件爲什麼使用http.route()方法的使用類型= 「JSON」 中的OpenERP

類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"以及爲什麼.. ??

回答

1

這兩者都是關於客戶端和服務器之間的通信。 HttpRequest通過衆所周知的GET和POST方法進行通信。這意味着以下內容:

  • 客戶端發送在URL編碼的請求(GET方法)或在HTTP主體(POST方法)
  • 服務器返回對應於該請求的對象。可能是一個HTML頁面,PNG圖像,CSS文件,JavaScript,XML編碼數據或其他。

JsonRequest是用於客戶端/服務器通信的另一種協議的實現 - JSON-RPC 2.0。您可能希望lo採取here表格更多信息。這是一個遠程過程調用(RPC)協議,這意味着它允許客戶端啓動服務器上某些方法的執行,並將一些參數傳遞給此方法。作爲響應,客戶端通過方法調用獲取一些數據。

編輯 - 用@ openerpweb.httprequest - 一些關於裝飾器的更多的話@ openerpweb.jsonrequest和@ openerpweb.httprequest

一些方法與@ openerpweb.jsonrequest裝飾,其他方法裝飾。這意味着沒有別的,但是第一組方法將通過JSON RPC協議執行,第二組將通過純HTTP協議訪問。

現在有什麼區別?我是否需要jsonrequest和httprequest?讓它像這樣簡化:JSON更適合在服務器上執行方法並獲得結果。當我們只需訪問服務器上的某些資源時,HTTP更簡單,更易於使用。

爲了清楚起見,我們用一些示例來「裝飾」它。看看web.controllers.main的以下方法。導出類別:

@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」方法 - 像法CSS()的web.controllers.main.Web類:

@openerpweb.httprequest 
def css(self, req, mods=None): 
    .... 

所有這種方法並是返回一個CSS文件客戶端。這是一個簡單的操作,例如訪問圖像,HTML網頁或服務器上的其他資源。我們在這裏返回的資源與前面例子中的Python列表沒什麼兩樣。我們不需要額外的格式來編碼它。所以我們不需要額外的數據編碼格式作爲JSON和JSON RPC的遠程過程調用協議。

類型=「JSON」:

它將調用JSONRPC作爲參數傳遞給http.route()所以在這裏,將僅存在JSON數據能夠通過JSONRPC通過,這將只接受JSON數據對象作爲參數。

類型= 「HTTP」:

作爲compred到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"} 
+0

我已經得到了那個之前,但最後感謝Jainik ..! :) –

2

基本上type =「json」用於傳遞來自控制器的數據,其中type =「html」用於通過http請求進行響應。

例如,從上面的代碼: url「/ website_mail/email_designer //」將響應任何特定的http請求並路由到其網頁,因爲url「/ website_mail/snippets」只會傳遞json數據到其呈現的模板,但沒有與此網址相關的物理網頁。

2

接收JSON的方法可以通過將'json'傳遞給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 
相關問題