Django期望json加载中的字符串或缓冲区

时间:2013-02-13 18:07:26

标签: php django json urllib

所以当我尝试使用urllib解析从php源发送到django客户端的Json字符串来获取请求时,我在django中获得expected string or buffer。 我也在使用芹菜任务。

字符串是:

"511bd5112aa8c"

腓:

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())但也没有运气。

2 个答案:

答案 0 :(得分:1)

您的JSON很好。问题在于你如何使用它。

Celery是一种异步执行计算的机制。当你打电话

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

这与调用函数不同。您将数据发送到队列,稍后由函数处理。

apply_async没有,无法返回函数计算的值。相反,它返回的是AsyncResult object,其中包含有关将在何处以及如何处理任务的大量详细信息。

如果您想对从页面获得的JSON做一些事情,则必须从 inside 任务中执行此操作。排队任务的代码根本就不会看到返回值。

仅用于测试,您可以使用apply同步调用任务。这将返回一个EagerResult对象,但您可以从中获取函数返回值,因为它会导致代码阻塞直到函数返回。这看起来像这样:

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

但我真的只建议进行测试/调试,因为它完全取消了芹菜的异步处理给你带来的好处。

答案 1 :(得分: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中的文本。