因此,当我试图使用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中的文本替换为响应变量。