2015-07-12 47 views
0

我在控制器中定義的函數:的web2py - AJAX調用返回404或無法處理的參數

def get_config_values(): 
    path = unescape(request.vars['path']) 
    config = get_config_as_dict(path) 
    return dict(config) 

在我看來,我使用jQuery $.ajax()調用它的觀點:

$.ajax({ 
     url: "{{=URL('get_config_values.json')}}", 
     contentType: "application/json; charset=utf-8", 
     data: { 
     path: page_path, 
     }, 
     error: function(x, y, z) { 
     show_error(x.responseText, y, z); 
     hide_drawer(); 
     }, 
     success: function(data) { 
     $('#drawer_content').html(data); 
     }, 
     type: 'POST', 
    }); 

簡而言之,我無法得到這個工作。

  • 如果我用type: 'POST'然後按預期的函數被調用,但path參數從未使它通過控制器的功能(這只是None
  • 如果我將其更改爲type: 'GET' web2py的決定作用做根本不存在,並返回一個HTTP 404(即使我從URL中刪除.json,此操作仍然存在)。 web2py錯誤日誌中沒有錯誤。

web2py中似乎表現得很奇怪在這裏 - 獲得那個職位的第一名我有工作,顯式地設置contentType: "application/json"否則我會看到一個404有作爲,儘管data:'json'已經存在。

有沒有其他人看到和解決這個問題?我不在乎電話是GET還是POST,我只是想讓它工作!

回答

1

有幾個問題。首先,當web2py操作返回一個字典時,web2py會查找要執行的相關視圖(根據操作的路徑以及擴展名)。在這種情況下,它將查找路徑爲/views/controller_name/get_config_values.json的視圖。如果它沒有找到該視圖,它可能會嘗試使用generic.json視圖,但只有通過response.generic_patterns明確啓用了通用視圖(在腳手架應用程序中,所有通用視圖默認情況下都會啓用,但僅適用於本地請求) 。否則,您將收到404錯誤(如果您在瀏覽器開發人員工具中檢查錯誤消息的正文,則應該看到有關無效視圖的消息)。

其次,要通過jQuery JSON後,你有你的JavaScript對象轉換爲JSON字符串:

data: JSON.stringify(
    { 
     path: page_path 
    } 
), 

通過上述,您現在應該有page_pathrequest.vars.path服務器上的價值。

最後,如果您向web2py請求.json網址,它會將Content-Type響應標頭設置爲「application/json」。但是,根據您的Javascript代碼,看起來您想要返回HTML(假設您將結果放置在頁面上的div中)。所以,你可能不應該在請求中使用.json擴展名(你也可以通過設置dataType: 'html'明確地告訴jQuery,響應是HTML。

所以,請嘗試以下操作:

$.ajax({ 
    url: "{{=URL('get_config_values')}}", 
    contentType: "application/json; charset=utf-8", 
    data: JSON.stringify({ 
    path: page_path, 
    }), 
    error: function(x, y, z) { 
    show_error(x.responseText, y, z); 
    hide_drawer(); 
    }, 
    success: function(data) { 
    $('#drawer_content').html(data); 
    }, 
    type: 'POST', 
}); 

然後創建從返回的字典生成所需的HTML一個get_config_values.html視圖,否則有get_config_values功能直接返回一個HTML字符串。

如果您希望將JSON返回給瀏覽器,那麼在嘗試將其放入div之前,您需要更改success回調來處理JSON。

+0

感謝Anothony - 如果您返回字典,我還沒有意識到web2py會去尋找一個視圖。我用'import json;返回json.dumps(..)'來返回一個字符串,而不是字典,它工作正常。 – Jonny

相關問題