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)

しかし、セロリの非同期処理がもたらす利点を完全に無効にするため、テスト/デバッグの場合にのみお勧めします。

于 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 に答える