2013-02-13 50 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

相关问题