12

最近我一直在玩其他框架,比如 NodeJS。

我喜欢返回响应的可能性,并且仍然能够进行进一步的操作。

例如

def view(request):
  do_something()
  return HttpResponse()

  do_more_stuff() #not possible!!!

也许 Django 已经提供了一种在返回请求后执行操作的方法,如果是这样的话,那就太好了。


非常感谢您的帮助!=D

4

3 回答 3

10

不是开箱即用,因为您已经从该方法中返回。您可以使用像Celery这样的东西,它将do_more_stuff任务传递到队列中,然后让它do_more_stuff()在 http 请求/响应流之外运行。

于 2010-04-30T08:59:36.207 回答
8

Django 允许您使用 Signals 完成此操作,可以在此处找到更多信息。(请注意,正如我在下面的评论中所说,信号不是非阻塞的,但它们确实允许您在视图中返回响应后执行代码。)

如果您正在考虑执行很多很多异步请求并且需要它们是非阻塞的,您可能需要查看Tornado

于 2010-04-30T08:59:56.440 回答
2

因为你是从函数返回的,所以 do_more_stuff 永远不会被调用。

如果您正在按照罗斯的建议(Celery 为 +1),在返回之前做一些繁重的工作。

但是,如果您正在考虑返回一些内容......那么做一些事情并将更多内容返回给用户流媒体可能就是您正在寻找的。您可以将迭代器或生成器传递给 HttpResponse,它会迭代并以涓涓细流的方式推出内容。感觉有点恶心,但如果你是发电机摇滚明星,你可能能够在不同的州做足够多的事情来完成你想要的。

或者我想你可以简单地重新设计你的页面来使用大量的 ajax 来做你需要的事情,包括触发 django 视图的事件,从视图中读取数据等。

这有点归结为异步的负担所在:客户端、服务器或响应。

我对 node.js 还不是很熟悉,但是看看你正在谈论的用例会很有趣。

编辑:我对信号做了更多的研究,虽然它们确实发生在进程中,但在 django 处理请求后,有一个内置的 request_finished 信号,尽管它更像是一个包罗万象的东西而不是特定的东西。

于 2010-04-30T10:31:49.213 回答