2

この言語をよりよく理解するために、私は Hacker News API を使用するクライアントの構築に取り組み始めました。以下のコードは、求人フィードから最初の 10 項目を取得することになっています。最初に ID のリストを収集し、それらの ID を反復処理して、アイテムの詳細を取得するための非同期リクエストを作成します。これにより、完了時にコールバック関数が起動されます。そのすべてがうまく機能しています。ただし、このようにネストされている場合、render 関数は何も返さないようです。このルートに到達すると、次のエラー メッセージが表示されます。The view feed.views.index didn't return an HttpResponse object. It returned None instead.

Node でこれをコーディングしていた場合、問題なく動作するので、言語 (またはフレームワーク) が非同期要求やスコープでどのように処理するかを理解していないことが原因であると想定しています。私は何を間違っていますか?

 def index(request):
    job_ids = firebase.get('jobstories', None)
    stories = []

    def append_story(story):
        stories.append(story)
        print(len(stories))
        if len(stories) == 10:
            return render(request, 'feed/index.html', {'items': stories})

    count = 0
    for ts_id in job_ids:
        if count < 10:
            count += 1
            firebase.get_async('item/' + str(ts_id), None, callback=append_story)
4

1 に答える 1

1

まず第一に、おそらく関数append_story内で定義したくないでしょう。index

第二に、あなたが失敗している理由は、すべての Django ビューが のHttpResponseようなものを返す必要があるためですreturn HttpResponse("Hello")。python/django はそのままでは async をサポートしていないため、async を実行したい場合は、代わりに ajax を使用することを検討してください。そのようなことを行う方法の例を次に示します: Django - How to use asynchronous task queue with celery and redis .

基本的には、ビューを生成し、javascript を使用して、firebase 情報を取得する ajax ビューを呼び出し、結果を取得した後にページを適切に更新するという考え方です。

于 2016-05-06T20:28:23.320 に答える