2010-05-25 55 views
3

在一个挂架控制器中,我想首先返回对请求的响应(以便用户尽快得到响应),然后执行一些不需要的附加操作(比如更新视图计数等)恰好产生了回应。做这种事情的最佳做法是什么?在塔架中,如何在编写回应后执行操作?

谢谢!

回答

2

在大多数基于wsgi的服务器上(比如标准的wsgiref,nwsgi等),有一种方法可以将身体的某些部分发送出去并发送更多的内容。我想“发送更多”是可选的。

使用收益而不是回报。 WSGI的例子(不知道是否转换顺利进入主塔):

def application(environ, start_response): 
    start_response('200 OK', [('Content-type','text/plain')]) 
    yield 'body starts. You should see this in browser already' 
    # do something 
    yield 'some more of body' 

一旦请求处理用完的代码运行,它关闭连接。

现在,这一定会在我尝试过的标准wsgi服务器上工作。我想听听这是否适用于主塔。

+0

请注意,很多WSGI中间件在传递之前都会收集所有响应。 IIRC WebError就像这样,所以如果你在Pylons的development.ini文件中debug = true,那么这种背景可能不起作用。 – 2010-07-07 21:48:25

0

我没有尝试Python的线程还没有机会,但你可以这样做:

def controller_method(self): 
    # controller logic here 
    html = render('/template.mako') 
    # start a thread here 
    return html 

通过所有的逻辑后,启动线程,但只是在返回前,你应该避免冲突线程。

您可能还会看看RabbitMQ或其他消息队列软件。您可以通过发送队列中的作业来卸载主要的Web应用程序。

+0

谢谢!我想有没有简单的方法来刷新响应,然后在相同的请求线程中做更多的工作? – 2010-05-27 17:43:15

+0

我不这么认为。如果您查看可以制作的最基本的WSGI应用程序,则可以将HTML发送到您的函数中的浏览器。 – 2010-05-29 21:29:58

+0

线程可能工作,但他们可能不会。尤其是长寿命的后台线程和服务器关闭有问题:如果你不让它们守护线程,服务器可能永远不会关闭;如果你使它们成为守护进程线程,那么它们可能会在关键操作中被中断,并带有奇怪的副作用,如所有模块全局变为None,导致出现奇怪的错误。我还没有使用Pylons环境中的线程,但Pylons邮件列表对这些问题进行了一些讨论。 – 2010-07-07 21:50:50

相关问题