2012-08-03 48 views
22

我有一個django應用程序,有幾個視圖通過POST請求接受json對象。將JSON對象是中等複雜築巢幾層,所以我使用JSON庫解析raw_post_data,如下所示:django:使用json對象測試基於POST的視圖

def handle_ajax_call(request): 
    post_json = json.loads(request.raw_post_data) 

    ... (do stuff with json query) 

接下來,我想寫這些視圖測試。不幸的是,我無法弄清楚如何將json對象傳遞給客戶端。下面是我的代碼最簡單的情況下版本:

def test_ajax_call(self): 
    c = Client() 
    call_command('loadfixtures', 'temp-fixtures-1') #Custom command to populate the DB 

    J = { 
     some_info : { 
     attr1 : "AAAA", 
     attr2 : "BBBB", 
     list_attr : [ "x", "y", "z" ] 
     }, 
     more_info : { ... }, 
     info_list : [ 1, 22, 23, 24, 5, 26, 7 ] 
    } 

    J_string = json.dumps(J) 
    response = c.post('/ajax/call/', data=J_string) 

當我運行測試,它失敗:

AttributeError: 'str' object has no attribute 'items' 

如何傳遞JSON對象在Client.post方法?

回答

45

The documentation似乎意味着如果您將content_type參數傳遞給client.post,它會將data值視爲文檔並直接POST。所以試試這個:

response = c.post('/ajax/call/', content_type='application/json', data=J_string) 
+1

太棒了!感謝您解讀文檔中的細紋。它從未專門提到json,所以它在我的任何搜索中都沒有出現。 – Abe 2012-08-05 03:25:31

+0

請注意,對於這個特定的用例,request.is_ajax()可能不起作用。因此,如果您在request.META ['CONTENT_TYPE']中使用類似'application/json'的東西來檢測該調用是否是Ajax,Daniel的解決方案還具有正確設置內容類型標題的優點。 – 2013-02-27 21:09:07

+1

這是添加該內容類型時收到的發佈信息:',所有數據成爲關鍵字,那看起來不正確。 – Hassek 2013-09-18 21:04:11

相關問題