python在异步回调中调用django的render函数不起作用

时间:2016-05-06 19:55:27

标签: python django firebase hacker-news

经验丰富的NodeJS程序员和新的python(v3.x)。为了更好地理解语言,我开始着手构建一个使用Hacker News API的客户端。下面的代码应该从他们的工作提取中提取前10个项目。它首先收集id的列表,遍历这些ID,然后发出异步请求以获取项目详细信息,这样就完成后会触发回调函数。所有这一切都很好。然而,看起来渲染函数在嵌套时没有返回任何东西。当我点击此路线时,收到以下错误消息: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)

[编辑]修正了一个拼写错误

1 个答案:

答案 0 :(得分:1)

首先,您可能不希望在append_story函数中定义index

其次,您失败的原因是因为每个Django视图都必须返回HttpResponse之类的return HttpResponse("Hello")。由于python / django不支持开箱即用的异步,如果你想做异步,请考虑使用ajax。以下是您可以执行此类操作的示例:Django - How to use asynchronous task queue with celery and redis

基本上我的想法是生成一个视图,然后使用javascript调用ajax视图来提取你的firebase信息,然后在获得结果后适当地更新你的页面。