2013-02-13 104 views
1

因此,我在Django獲得expected string or buffer當我試圖解析從PHP源發送到Django客戶端使用urllib來獲取請求的JSON字符串。 我也在使用芹菜任務。Django預期的字符串或緩衝區在JSON加載

的字符串是:

"511bd5112aa8c" 

PHP的:

echo json_encode($access_token); 

Django的:

from celery import task 
from urllib2 import Request, urlopen, URLError 

@task() 
def replicate_data(req): 
     try: 
      response = urlopen(req) 
      the_page = response.read() 
     except URLError: 
      raise replicate_data.retry(countdown=15) 

     return the_page 



result=replicate_data.apply_async((req,), queue='rep_data') 
json.loads(result) 

我已經嘗試json.loads(result.decode())沒有運氣也。

有人嗎?

+0

你有沒有想要傳遞的字符串類型的例子? – datasage 2013-02-13 18:09:29

+0

,如果可能的話,你可以告訴我們在哪裏定義了「結果」變量 – furins 2013-02-13 18:10:09

+0

這是我的字符串511bd5112aa8c – psychok7 2013-02-13 18:10:47

回答

1

你的JSON很好。問題在於你如何使用它。

Celery是一種異步執行計算的機制。當您致電

result=replicate_data.apply_async((req,), queue='rep_data') 

這與調用函數不一樣。您正在將數據發送到隊列中,稍後由函數處理。

apply_async不,並且不能返回函數計算的值。相反,它返回的是一個AsyncResult object,其中包含許多關於任務將在何處以及如何處理的詳細信息。

如果你想用你從頁面獲得的JSON做些什麼,你必須從裏面做這個任務。排隊任務的代碼根本不會看到返回值。

僅用於測試,您可以與apply同步調用任務。這將返回一個EagerResult對象,但您可以從中獲取函數返回值,因爲它會導致代碼阻塞,直到函數返回。這將是這樣的:

result=replicate_data.apply((req,), queue='rep_data') 
return_value = result.return 
json.loads(return_value) 

但我真的只是提醒,測試/調試,因爲它完全勾銷的優點是芹菜的異步處理給你。

+0

這就是它..謝謝 – psychok7 2013-02-14 09:58:04

0

這是無效的json。嘗試使用一些節點名稱並將該標記分配爲具有有效json的值。現在json.loads將正常工作。

<?php 
$access_token = "511bd5112aa8c"; 
echo json_encode(array("token"=>$access_token)); 
?> 

編輯:

使用PHP的上述代碼。對於python使用:

json_res = json.loads('{"token": "511bd5112aa8c"}')  
print json_res['token'] 

將json.loads中的文本替換爲響應變量。

+0

一個字符串是完全有效的JSON - - 但它必須被引用。 – 2013-02-13 18:18:39

+0

我在我的解釋中沒有考慮引號。 – 2013-02-13 18:20:47

+0

它不工作,同樣的錯誤我應該怎麼做呢? – psychok7 2013-02-13 18:20:50

相關問題