【问题标题】:Django expected string or buffer in json loadsjson加载中的Django预期字符串或缓冲区
【发布时间】:2013-01-29 09:14:06
【问题描述】:

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

字符串是:

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

有人吗?

【问题讨论】:

  • 你有你试图传递的字符串类型的例子吗?
  • 如果可能的话,请告诉我们“结果”变量的定义位置
  • 这是我的字符串 511bd5112aa8c
  • 更新了更多信息
  • 你的字符串是 511bd5112aa8c 还是 "511bd5112aa8c" ?它周围的引号很重要,并且应该在实际输出中,以使其成为有效的 JSON

标签: php django json urllib


【解决方案1】:

你的 JSON 很好。问题在于您尝试使用它的方式。

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

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

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

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

如果您想对从页面获得的 JSON 做一些事情,您必须从任务内部进行。将任务排队的代码根本不会看到返回值。

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 一个字符串是完全有效的 JSON -- 但它必须被引用。
    • 我的解释中没有考虑引号。
    • 这是我现在的 json {"token":"511bd95c10116"}
    • 我做了这个 json_res = json.loads(result) print json_res['token'] 我仍然得到同样的错误:(
    • 我觉得使用 result=replicate_data.apply_async((req,), queue='rep_data') 数据是异步发送的,因为在将响应分配给结果之前执行了其他部分代码.
    猜你喜欢
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多