1

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

字符串是:

"511bd5112aa8c"

php:

echo json_encode($access_token);

姜戈:

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

任何人?

4

2 回答 2

1

你的 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)

但我真的只建议测试/调试,因为它完全抵消了 celery 的异步处理给你的优势。

于 2013-02-13T23:54:50.363 回答
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 中的文本替换为响应变量。

于 2013-02-13T18:17:31.563 回答