【问题标题】:python calling django's render function in an async callback not workingpython在异步回调中调用django的渲染函数不起作用
【发布时间】:2016-09-02 00:02:50
【问题描述】:

为了更好地理解语言,我开始构建一个使用 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)

【问题讨论】:

  • Django 不执行异步操作(即所有视图都必须返回响应对象)。 Django 频道看起来很有趣(但我还没有尝试过)。
  • 是的,当我进行同步调用时(firebase.get('item/' + str(ts_id)) 工作正常,但它很慢。我会调查频道谢谢。
  • 怎么做到的?我需要它,即使它很慢。请按照您所说的@jeffskelton3 提供有关使用异步调用的代码sn-p

标签: python django firebase hacker-news-api


【解决方案1】:

首先,您可能不想在index 函数中定义append_story。

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

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

【讨论】:

  • 是的,使用 JavaScript/Ajax 将是我的第一个停靠点。我已经是一位非常有经验的 JS 开发人员,所以我尝试通过 Python 做所有事情,这样我就可以学习它。我已经在看芹菜了,你的链接证实了我的直觉。感谢您的帮助。
猜你喜欢
  • 2018-02-24
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 2014-10-24
  • 1970-01-01
  • 2021-06-14
相关资源
最近更新 更多