渲染视图后如何做某事?(Django的)

ric*_*ick 10 python django

我想在使用渲染视图后做一些事情

return render_to_response()
Run Code Online (Sandbox Code Playgroud)

信号是唯一的方法吗?我是否需要编写自定义信号或request_finished给我足够的信息?基本上我需要知道呈现了什么页面,然后做出响应的动作.

谢谢.

来自评论的更新:我不想阻止页面的渲染,所以我想首先渲染页面然后执行操作.

Ale*_*erg 11

您生成一个单独的线程并让它执行操作.

t = threading.Thread(target=do_my_action, args=[my_argument])
# We want the program to wait on this thread before shutting down.
t.setDaemon(False)
t.start()
Run Code Online (Sandbox Code Playgroud)

这将导致'do_my_action(my_argument)'在第二个线程中执行,即使在发送Django响应并终止初始线程之后,该线程仍将继续工作.例如,它可以发送电子邮件而不会延迟响应.


S.L*_*ott 5

如果您有一个长时间运行的过程,您有两个简单的选择.

  1. 在发送响应页面之前生成子进程.

  2. 创建"后台服务守护程序"并将工作请求传递给它.

这一切都在Django之外.您可以使用进程或其他一些IPC方法与其他进程通信.


dar*_*dar 5

执行此操作的常见方法是使用消息队列。您将消息放入队列中,工作线程(或进程等)会使用该队列并在视图完成后执行工作。

Google App Engine 有任务队列 API http://code.google.com/appengine/docs/python/taskqueue/,amazon 有简单队列服务http://aws.amazon.com/sqs/

快速搜索并没有发现任何看起来像公认标准的 django 可插入项。

模拟功能的一种快速而肮脏的方法是将“消息”放入数据库表中,并让 cron 作业定期检查该表以执行工作。


ars*_*ars 5

Django 的 HttpResponse 对象在其构造函数中接受一个迭代器:

http://docs.djangoproject.com/en/dev/ref/request-response/#passing-iterators

所以你可以这样做:

def myiter():
    yield "my content"
    enqueue_some_task()
    return

def myview(request):
    return HttpResponse(myiter())
Run Code Online (Sandbox Code Playgroud)

迭代器的正常使用是发送大数据而不将其全部读入内存。例如,从文件中读取块并适当地产生。我从未以这种方式使用过它,但它似乎应该有效。


Alb*_*oPL -1

在渲染响应中,您传递要显示的 html 页面。另一个页面需要发送一个帖子(通过 Javascript 或其他方式)来触发视图中的正确函数,然后该视图调用要显示的正确的下一页。