Django在json加载中需要字符串或缓冲区



因此,当我试图使用urlib解析从php源发送到django客户端的Json字符串以获取请求时,我在django中得到了一个expected string or buffer。我也在使用芹菜任务。

字符串为:

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

有人吗?

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

Celery是一种异步执行计算的机制。当你呼叫时

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

这与仅仅调用一个函数是不一样的。您正在将数据发送到队列,以便稍后由函数处理。

apply_async不能,不能返回函数计算的值。相反,它返回的是一个AsyncResult对象,其中包含关于在何处以及如何处理任务的许多详细信息。

如果你想对从页面中获得的JSON做一些事情,你必须在任务内部的中完成。使任务排队的代码根本看不到返回值。

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

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

但我真的只建议用于测试/调试,因为它完全抵消了芹菜异步处理给您带来的优势。

它是无效的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中的文本替换为响应变量。

相关内容

  • 没有找到相关文章

最新更新