所以当我尝试使用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())
但也没有运气。
人
答案 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中的文本。